为什么此代码会产生内存泄漏?我是新手,不理解。该对象被分配给shared_ptr,以便它仍然可访问或不可访问?我需要在另一个函数中创建新实例,这样我才能想到另一种方法。有什么我需要解决的吗?
std::shared_ptr<MyClass>newItem(getNewMyClassInstance());
MyClass* MyClass::getNewMyClassInstance()
{
return new MyClass();
}
上面提到的代码和
之间有什么区别std::shared_ptr<MyClass>newItem(new MyClass());
关于内存泄漏?
答案 0 :(得分:8)
有一个微妙的区别。
每当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>();
}
答案 1 :(得分:5)
我怀疑有人在做的是通过返回共享指针,确保指针总是被智能指针包裹。通过返回一个裸指针;这种保证丢失了;从而使其对意外泄漏更加开放;即
{ getNewMyClassInstance()->doStuff() }
将在一个案件中泄漏;但不是在另一个。
然而;您发布的示例用法不会泄露。
答案 2 :(得分:2)
实际上你的代码不会产生任何内存泄漏。但要回答你的第二个问题:
getNewMyClassInstance()
的返回值,则会产生内存泄漏。我的意思是你返回一个原始指针然后调用者可能忘记正确释放它。您可以返回共享指针以获得更好的代码。答案 3 :(得分:0)
这些代码都没有造成内存泄漏。
你什么都没有&#34;修复&#34;。