gpt4 book ai didi

c++ - 为什么一个代码会产生内存泄漏而另一个不会?

转载 作者:太空狗 更新时间:2023-10-29 23:26:15 25 4
gpt4 key购买 nike

为什么这段代码会产生内存泄漏?我是新手,不懂。该对象被分配给 shared_ptr 所以它是否仍然可以访问?我需要在另一个函数中创建新实例,所以我想不出另一种方法来做到这一点。有什么我需要解决的吗?

std::shared_ptr<MyClass>newItem(getNewMyClassInstance());

MyClass* MyClass::getNewMyClassInstance()
{
return new MyClass();
}

还有上面提到的代码和

std::shared_ptr<MyClass>newItem(new MyClass());

关于内存泄漏?

最佳答案

有细微差别。

每当 MyClass 的构造函数抛出异常时,new MyClass(); 不会产生任何内存泄漏,因为分配给 MyClass 的存储空间是 automatically freed by new when an exception is thrown .在您的问题中显示的片段中,没有一种形式会导致内存泄漏。

但是,如果将 getNewMyClassInstance() 的定义扩展为在范围退出时抛出异常,那么您的第一种形式确实会导致内存泄漏:

MyClass* MyClass::getNewMyClassInstance()
{
ThrowsWhenDestructed t;
return new MyClass();
}

std::shared_ptr<MyClass>newItem(getNewMyClassInstance());
// MyClass pointer is not acquired, and lost to oblivion.

对于这种形式(函数返回的原始指针,然后由智能指针获取),内存可能会丢失。这几乎总是不是问题,但可能适合您。

作为替代方案,您为什么不定义:

std::shared_ptr<MyClass> MyClass::getNewMyClassInstance()
{
return std::make_shared<MyClass>();
}

关于c++ - 为什么一个代码会产生内存泄漏而另一个不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49108565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com