#include <iostream> using namespace std; class data { int* value; public: data(int v){value = new int(v);} ~data(){delete value;} void display(){cout<<"指向的内存:"<<&*value<<endl;}; }; void testCopy() { data m(10); data p = m; m.display(); p.display(); }
这段代码的问题是:delete被调用了2次,由于第二次调用的复制构造函数,指针p->value指向m->value的内存,并没有分配新的内存。
解决办法:
1.把复制构造函数定义为private:
class data { int* value; data(const data&); data& operator = (const data&); public: data(int v){value = new int(v);} ~data(){delete value;} };
2.自定义复制构造函数,给指针对象分配内存
class data { int* value; //data(const data&); //data& operator = (const data&); public: data():value(NULL){} data(int v){value = new int(v);} ~data(){delete value;} data(const data& d){ if (NULL != d.get_ptr()) { value = new int(*d.get_ptr()); } }; void display() const {cout<<"指向的内存:"<<&*value<<endl;} int* get_ptr() const { return value;} }; void testCopy() { data m(10); data p = m; m.display(); p.display(); }
总想把每一篇文章精雕细琢之后以完美的面貌示人,就像演员在演出前都要彩排,总想准备好之后再去展现精彩的一面,但人生的每一刻都是精彩的,就算现在还不完善也要发出来,作为自己一直在学习的一种见证。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步