如何让未赋值给变量的方法返回对象自动调用析构函数?
解决临时对象自动析构的问题
这是个典型的裸指针内存管理问题——你通过new创建的对象必须用delete手动销毁,但链式调用里的临时裸指针没有被绑定到变量,自然没人触发delete,导致内存泄漏和析构函数未被调用。
要实现你想要的“临时对象自动析构”,现代C++的标准解决方案是使用智能指针,其中std::unique_ptr最适合你这个“对象仅使用一次”的场景,它会在自身生命周期结束时自动销毁所持有的对象,触发析构函数。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <memory> // 包含智能指针头文件 class Foo{ public: int *a; Foo(int n); ~Foo(); std::unique_ptr<Foo> add(int n); // 修改返回类型为unique_ptr void print(); }; Foo::Foo(int n){ a=(int*)malloc(sizeof(int)); *a=n; } Foo::~Foo(){ printf("destructor called\n"); free(a); } std::unique_ptr<Foo> Foo::add(int n){ // 使用make_unique创建对象,比直接new更安全 return std::make_unique<Foo>(*a + n); } void Foo::print(){ printf("foo is =%i\n",*a); } int main(){ // 使用unique_ptr管理bar,无需手动delete std::unique_ptr<Foo> bar = std::make_unique<Foo>(1); // 链式调用,add返回的unique_ptr会在表达式结束后自动析构 bar->add(1)->print(); }
运行输出
foo is =2 destructor called // add返回的临时对象的析构(表达式结束时触发) destructor called // bar的析构(main结束时触发)
关键说明
std::unique_ptr是独占所有权的智能指针,它接管了动态分配对象的所有权,当unique_ptr离开作用域(比如链式调用的表达式执行完毕),就会自动调用delete销毁所持对象,进而触发Foo的析构函数。- 如果坚持使用裸指针,C++没有语法能让临时裸指针自动触发
delete——裸指针本身没有自动管理内存的语义,必须手动绑定到变量后调用delete,这也是为什么你之前的临时变量写法是唯一的裸指针解决方案,但显然不够优雅。
内容的提问来源于stack exchange,提问作者giuliano-macedo
相关产品推荐
相关产品推荐

