指針成員與拷貝構造一個類中包含指針成員,需要特別注意拷貝構造函數,一不小心就會出現內存泄露和重復釋放,導致程序無法正常運行。 指針與默認拷貝構造函數/* 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 使用自定義拷貝構造函數,采用深拷貝方式,對象分別指向不同的地址,不會出現重復釋放的情況。
|