类中包含指针成员

类中包含指针成员,特别小心拷贝构造函数,一步小心就内存泄露。其中一个析构就有可能出现悬挂指针。

#include <iostream>

using namespace std;

class Do {
public:
	Do(): d(new int(0)) {}
	~Do() {delete d;}
	int* d;
};

int main()
{
	Do a;
	Do b(a);
	cout << *a.d << endl;
	cout << *b.d << endl;
}
(myenv)root@gavin-VirtualBox:/media/sf_share/pbase# g++ -o a a.cpp
(myenv)root@gavin-VirtualBox:/media/sf_share/pbase# ./a
0
0
*** Error in `./a': double free or corruption (fasttop): 0x000000000103ac20 ***
Aborted (core dumped)
  • 解决方法1:通常最佳的解决方案是用户自定义拷贝构造函数来实现深拷贝。
#include <iostream>

using namespace std;

class Do {
public:
	Do(): d(new int(0)) {}
	Do(Do &s): d(new int(*s.d)) {} //拷贝构造函数,从堆中分配内存,并用*s.d初始化
	~Do() {delete d;}
	int* d;
};

int main()
{
	Do a;
	Do b(a);
	cout << *a.d << endl;
	cout << *b.d << endl;
}
(myenv)root@gavin-VirtualBox:/media/sf_share/pbase# g++ -o a a.cpp
(myenv)root@gavin-VirtualBox:/media/sf_share/pbase# ./a
0
0
  • 解决方法2:移动语义。