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_
相关产品推荐
相关产品推荐

