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

如何让未赋值给变量的方法返回对象自动调用析构函数?

解决临时对象自动析构的问题

这是个典型的裸指针内存管理问题——你通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:47:25