You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:05:19