C++指针悬挂(赋值运算符重载)
2015-01-14 01:47
337 查看
如:
string a("sky1"),b("sky2") ;
b = a ;
程序在运行的时候创建了两个对象,分别是a和b,然后调用构造函数。当执行“b=a”的时候,因为没有用户自己定义的赋值运算符函数,于是程序自动调用默认的赋值函数,两个指针指向了同一个内存,“sky2”这个空间的内存应经不能访问了。当程序执行到析构函数,释放内存时,先撤销b,释放了b指向的内存,接着在释放a,然而,虽然a的指针还在,但是,因为它与b指向的是同一内存,又由于“sky1”的内存空间已经被执行析构b的时候释放掉,现在执行a在此释放,无法找到要释放的内存,并且,之前b指向的内存还没有释放掉,析构函数找不到它在哪里?就出现了所谓的“指针悬挂问题”。
如下解决:
string a("sky1"),b("sky2") ;
b = a ;
程序在运行的时候创建了两个对象,分别是a和b,然后调用构造函数。当执行“b=a”的时候,因为没有用户自己定义的赋值运算符函数,于是程序自动调用默认的赋值函数,两个指针指向了同一个内存,“sky2”这个空间的内存应经不能访问了。当程序执行到析构函数,释放内存时,先撤销b,释放了b指向的内存,接着在释放a,然而,虽然a的指针还在,但是,因为它与b指向的是同一内存,又由于“sky1”的内存空间已经被执行析构b的时候释放掉,现在执行a在此释放,无法找到要释放的内存,并且,之前b指向的内存还没有释放掉,析构函数找不到它在哪里?就出现了所谓的“指针悬挂问题”。
如下解决:
#include<iostream> #include<string.h> using namespace std; class String { public : String(int size = 1,char * str = "\0") { ptr = new char[size]; strcpy(ptr,str); this->size = size; } String(const String &obj) { size = obj.size; ptr = new char[size]; strcpy(ptr,obj.ptr); } String operator=(const String & obj)//避免造成指针悬挂问题 { size = obj.size; delete [] ptr;//先释放原来的内存 ptr = new char[size];//生成新的内存 strcpy(ptr,obj.ptr);//拷贝字符串 return *this; } ~String() { delete [] ptr; } private : char *ptr; int size; }; int main() { String str1(10,"HangZhou"),str2(10,"HDU"); str2 = str1;//容易造成指针悬挂 return 0; }
相关文章推荐
- C++中的指针悬挂问题(内存泄漏)
- c++ 里面由浅拷贝引起的悬挂指针
- C++_指针悬挂和赋值操作符的重载
- C++中指针悬挂问题的产生以及如何避免
- C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现
- C++_指针悬挂和赋值操作符的重载
- C++易混点——深度解析指针悬挂和虚析构函数
- C++悬挂指针: new与delete的一些理解
- C++深层复制解决指针悬挂
- c++指针悬挂
- C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现
- 成员函数指针与高性能的C++委托(下篇)
- 编程经验点滴(三)——《C、C++中指针加 1 的问题》
- 指针---C/C++的灵魂
- 成员函数指针与高性能的C++委托(上篇)
- 在c++中利用指针实现动态数组
- C++深度探索系列:智能指针(Smart Pointer) /2
- C++指针使用方法解惑
- 【推荐】C++中的健壮指针和资源管理
- 突破C++的虚拟指针--C++程序的缓冲区溢出攻击