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

C++中存储对象指针到成员变量时输出异常问题求助

问题分析与解决

核心错误1:变量名遮蔽导致成员变量未初始化

你在Abstract类的构造函数里写了x = x;,这里的问题是构造函数的参数名和成员变量名完全相同,局部参数x遮蔽了成员变量x,所以这条语句只是把参数x的值赋给了它自己,成员变量x根本没被初始化,一直是默认的0.0,这就是输出0的直接原因。

核心错误2:内存泄漏

A::receive里的(new Derived(x))->clone()写法会导致内存泄漏:new Derived(x)创建的对象没有被任何智能指针接管,调用完clone后这个原始对象就被遗弃在堆内存里,永远不会被释放。


修正方案

1. 修复Abstract构造函数的初始化问题

有两种常用写法:

  • 用this->明确指定成员变量:
Abstract(double x)
{
    this->x = x;
}
  • 更推荐用成员初始化列表(效率更高,也避免遮蔽问题):
Abstract(double x) : x(x) {}

初始化列表中,冒号后的第一个x是成员变量,第二个是构造函数参数,编译器能正确区分。

2. 修复receive函数的内存泄漏

把new替换为智能指针创建,确保所有对象都被智能指针管理:

void A::receive(double x)
{
    auto temp = std::make_unique<Derived>(x);
    abstract = std::move(temp->clone());
    std::cout << x << std::endl;
}

如果你的场景不需要clone方法(比如只是创建一次对象),也可以直接写成:

abstract = std::make_shared<Derived>(x);

3. 可选优化:const正确性

Derived::getX函数不修改任何成员变量,应该加上const修饰,符合C++的const正确性原则:

  • derived.h中声明:
double getX() const override;
  • derived.cpp中实现:
double Derived::getX() const
{
    return x;
}

修正后运行结果

程序会输出:

2.0
2.0
im dead

im dead是Derived析构函数的输出,说明对象被正确释放,没有内存泄漏。

内容的提问来源于stack exchange,提问作者jd_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:24:59