在函数C+中使用对象后删除该对象+; 我在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; }

在函数C+中使用对象后删除该对象+; 我在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; },c++,memory-leaks,C++,Memory Leaks,我的问题是如何删除函数AnObject::Foo()中的指针 //我读了一些建议,要求更改函数,不要在函数中创建带有单词new的对象。但是是否存在删除此指针的方法?您可以通过在AnObject::Foo中删除此来执行此操作,但我强烈建议您不要这样做。在这种情况下,您根本不需要指针: class AnObject{ public: AnObject Foo(){ return AnObject{}; } }; int main() { AnObject x

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


//我读了一些建议,要求更改函数,不要在函数中创建带有单词new的对象。但是是否存在删除此指针的方法?

您可以通过在
AnObject::Foo
中删除
来执行此操作,但我强烈建议您不要这样做。在这种情况下,您根本不需要指针:

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

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

如果你真的需要指针,考虑智能指针< /P>

#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;
}
#包括
类对象{
公众:
std::unique_ptr Foo(){
返回std::make_unique();
}
};
int main()
{
std::unique_ptr x=std::make_unique();
std::unique_ptr result=x->Foo();
返回0;
}

在这两种情况下,您都不需要
删除
任何内容,因为您正在使用RAII语义通过作用域处理内存清理;打电话的人必须打电话。原始指针无法自行管理。返回描述所有权并将自身清理的内容。删除的方式与后面的“delete obj”相同;不应删除函数中的对象,因为它会使返回的指针无效。所有者(
main
在您的情况下)应该销毁它:
删除结果。没有Matthias,问题是我把“删除”放在哪里了?我需要一个对象作为函数Foo()的结果。在Foo()之外,指针被释放,但对象的内存没有被删除,这会引发内存泄漏。这里的问题不是如何删除对象,而是对象的所有者。这是我在开发API时经常遇到的问题。智能指针是部分解决方案(弱\u ptr可以转换为共享\u ptr,因此不能保证)。唯一\u ptr如果您当然拥有它,但在您决定如何编写它之前,您需要在对象的整个生命周期内明确所有权。嗨,科里,使用智能指针,我也必须将函数的返回类型更改为智能指针的类型?@当然。调用函数的客户机也必须使用相同的语义,否则一旦离开函数,您的所有努力都将付诸东流。最理想的情况是,所有包含所有者指针(必须调用delete的指针)的代码都应该更改为std::unique_ptr或std::shared_ptr,无论是返回类型、成员变量、局部变量还是函数argument@Amateur,是的,然后调用者确切地知道他们可以对返回的值做什么,与使用常规指针进行猜测相反(除非您有一些约定,即所有原始指针都不拥有任何东西)。@all,简而言之,我需要将所有函数(返回对象的函数)的返回类型更改为智能指针?@业余爱好者不必担心函数返回对象(在堆栈上分配)。正如他所提到的,尽可能避免使用指针要容易得多,而不必担心对象的生命周期(即使可以使用智能指针来减少麻烦)。