C++11新特性学习笔记之移动构造函数
指针成员和浅拷贝
一般来说,如果一个类中有指针成员,则要小心拷贝成员函数的编写,因为如果不注意,则会造成程序的内存泄漏。如下所示的例子。
#include <iostream>
class HasPtrMem{
public:
HasPtrMem() : m_data(new int(0)){}
~HasPtrMem(){
if (m_data != nullptr)
{
delete m_data;
m_data = nullptr;
}
}
int *m_data;
};
int main(){
HasPtrMem a;
HasPtrMem b(a);
std::cout << a.m_data << std::endl;//0
std::cout << b.m_data << std::endl;//0
}
我们申明了一个带有指针成员的HasPtrMem类,在main函数中声明了对象a,再用对象a去初始化b,由于类中没有显示声明拷贝构造函数,则按照C++语法会调用编译器隐式生成的拷贝构造函数。这样就会出现以下一个问题:
a和b的m_data和都指向同一块堆内存,因此在main作用域结束后,a和b的析构函数依次被调用,比