菜单 搜索

每天一个C/C++知识点

媒体资源网 http://www.allchina.cn 2023/6/16

指针成员与拷贝构造

一个类中包含指针成员,需要特别注意拷贝构造函数,一不小心就会出现内存泄露和重复释放,导致程序无法正常运行。

指针与默认拷贝构造函数

/* Online C Compiler and Editor */#include using namespace std;class TestMemPtr { public: TestMemPtr() : ptr_(new int(0)) {} ~TestMemPtr() {delete ptr_;} int *ptr_;};int main() { TestMemPtr a; TestMemPtr b(a); cout << "a : " << *a.ptr_ << "addr: " << a.ptr_ << endl; cout << "b : " << *b.ptr_ << "addr: " << b.ptr_ << endl; return 0;}

执行结果:

a : 0addr: 0x55e5e83d7eb0b : 0addr: 0x55e5e83d7eb0free(): double free detected in tcache 2Aborted (core dumped)

因为类没有定义拷贝构造函数,使用默认拷贝构造函数,默认拷贝构造函数采用的浅拷贝方式,两块指针指向一块内存,析构时候,重复释放,导致程序崩溃。

指针与自定义拷贝构造函数

/* Online C Compiler and Editor */#include using namespace std;class TestMemPtr { public: TestMemPtr() : ptr_(new int(0)) {} TestMemPtr(TestMemPtr& t) { ptr_ = new int (*t.ptr_); } ~TestMemPtr() {delete ptr_;} int *ptr_;};int main() { TestMemPtr a; TestMemPtr b(a); cout << "a : " << *a.ptr_ << "addr: " << a.ptr_ << endl; cout << "b : " << *b.ptr_ << "addr: " << b.ptr_ << endl; return 0;}

执行结果

a : 0addr: 0x56449740beb0b : 0addr: 0x56449740bed0

使用自定义拷贝构造函数,采用深拷贝方式,对象分别指向不同的地址,不会出现重复释放的情况。