我有一个关于在C++中删除内存泄漏的问题。考虑以下代码:

class AnObject{
public:
    AnObject* Foo(){
        // how can I delete this object ???
        AnObject* obj = new AnObject();
        ...
        return obj;
    }
};

int main(){
    ...
    AnObject* x = new AnObject();
    AnObject* result = x->Foo();

    delete x;

    return 0;
}

我的问题是如何删除函数AnObject::Foo()中的指针?

//我读了一些需要更改功能的建议,不要用这个词来创建对象。但是,是否存在删除此指针的方法?

最佳答案

您可以通过删除this中的AnObject::Foo来做到这一点,但我强烈建议您不要这样做。在这种情况下,您根本不需要指针:

class AnObject{
public:
    AnObject Foo(){
        return AnObject{};
    }
};

int main()
{
    AnObject x{};
    AnObject result = x.Foo();
    return 0;
}

如果出于任何原因您确实确实需要指针,请考虑使用智能指针
#include <memory>
class AnObject{
public:
    std::unique_ptr<AnObject> Foo(){
        return std::make_unique<AnObject>();
    }
};

int main()
{
    std::unique_ptr<AnObject> x = std::make_unique<AnObject>();
    std::unique_ptr<AnObject> result = x->Foo();
    return 0;
}

在这两种情况下,您都不需要使用delete进行编码,因为您正在使用RAII语义通过作用域处理内存清理。

09-06 11:09