C++类构造函数指针赋值异常,改用new则正常的原因咨询
为什么第一个Color构造函数会导致异常值,而第二个能正常工作?
问题根源:第一个构造函数的指针指向了局部变量
你的第一个构造函数通过初始化列表,把类的指针成员指向了构造函数的参数局部变量:
Color(int Red, int Green, int Blue): red(&Red), green(&Green), blue(&Blue){ cout<<"Regular constructor called."<<endl; }
这里的Red、Green、Blue是构造函数的形参,属于栈上的局部变量——它们的生命周期仅存在于构造函数执行期间。当构造函数执行完毕,函数的栈帧会被销毁,这些局部变量占用的内存会被操作系统回收,或者被后续的函数调用(比如你的拷贝构造函数)覆盖。
此时buddy对象里的red、green、blue指针就变成了悬空指针:它们指向的内存已经不再属于你的程序,后续对这些指针的解引用操作(比如getRed()里的*red)属于未定义行为。
这就是为什么一开始能输出正确值(此时栈内存还没被覆盖),但调用拷贝构造函数后,栈内存被重新使用,原来的内存内容被改写,最终输出乱码值。
第二个构造函数的正确逻辑:使用堆内存
修改后的构造函数用new在堆内存上分配空间:
Color(int Red, int Green, int Blue){ this->red=new int(Red); this->green=new int(Green); this->blue=new int(Blue); }
堆内存的生命周期和栈内存不同:它不会随着函数栈帧的销毁而释放,而是从new分配开始,直到你显式调用delete才会被回收。所以buddy对象的成员指针指向的是始终有效的堆内存,后续解引用这些指针时,能稳定获取到正确的值。
额外注意事项
- 你需要为
Color类添加析构函数,在其中用delete释放堆内存,避免内存泄漏:~Color(){ delete red; delete green; delete blue; } - 当前的拷贝构造函数是空的,后续如果要正确实现,必须做深拷贝——为新对象的指针重新分配堆内存并复制值,而不是直接拷贝指针地址。否则两个对象会指向同一块堆内存,析构时会重复释放同一块内存,导致程序崩溃。
内容的提问来源于stack exchange,提问作者popoccy
相关产品推荐
相关产品推荐

