C++函数未用return关键字返回对象指针的问题咨询
分析你的C++代码问题:未返回指针的
get()函数 咱们来拆解这段代码里的问题和对应的解决办法:
核心问题:get()函数缺失返回语句
你声明的Thing* get()函数明确要返回一个Thing类型的指针,但函数体里只做了Thing* x = new Thing(33);,却没有return x;这一步。这会引发两个严重问题:
- 未定义行为:当你在
main()里执行a = get();时,函数没有返回合法指针,a会被赋值一个随机的内存地址(野指针)。后续调用a->display()时,程序可能直接崩溃,或者输出毫无意义的垃圾值,完全不可预测。 - 内存泄漏:你用
new创建的Thing(33)对象没有被任何指针持有,操作系统分配的这块内存永远无法被释放,会一直占用直到程序结束。
另外还有一个隐藏的内存泄漏:main()里一开始new Thing()创建的对象,在a = get();之后,原来的指针被覆盖了,这块内存也没人能释放了。
解决方法
1. 给get()函数添加返回语句
修改get()函数,在末尾加上return x;,让它正确返回创建的对象指针:
Thing* get(){ Thing* x = new Thing(33); return x; // 补上返回语句 }
这样a = get();就能拿到有效的指针,调用a->display()会输出预期的33。
2. 修复内存泄漏问题
在main()里,要记得释放所有动态分配的内存:
int main(){ Thing* a = new Thing(); std::cout<<"1: "<<a->display()<<std::endl; delete a; // 先释放原来的对象 a = get(); std::cout<<"2: "<<a->display()<<std::endl; delete a; // 释放get()返回的对象 return 0; }
如果不想手动管理内存,也可以用智能指针(比如std::unique_ptr),这样能自动释放内存,避免遗漏:
#include <iostream> #include <memory> // 包含智能指针头文件 using namespace std; class Thing{ public: int height; Thing(int h): height(h) {}; Thing(): height(10) {}; ~Thing(){}; int display(){ return this->height; } }; unique_ptr<Thing> get(){ return make_unique<Thing>(33); // 用make_unique创建智能指针 } int main(){ unique_ptr<Thing> a = make_unique<Thing>(); std::cout<<"1: "<<a->display()<<std::endl; a = get(); // 智能指针自动管理所有权,旧对象会被释放 std::cout<<"2: "<<a->display()<<std::endl; // 不需要手动delete,智能指针离开作用域会自动释放 return 0; }
内容的提问来源于stack exchange,提问作者Jack Of Blades
相关产品推荐
相关产品推荐

