为什么一个代码会产生内存泄漏而另一个代码却没有?

ann*_*ama 2 c++ memory pointers

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

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

MyClass* MyClass::getNewMyClassInstance()
{
    return new MyClass();
}
Run Code Online (Sandbox Code Playgroud)

还有上面提到的代码和之间的区别

std::shared_ptr<MyClass>newItem(new MyClass());
Run Code Online (Sandbox Code Playgroud)

关于内存泄漏?

YSC*_*YSC 8

有一个微妙的区别.

每当MyClass抛出的构造函数时,new MyClass();都不会产生任何内存泄漏,因为抛出异常时MyClass自动释放new分配的存储空间.在您的问题中显示的代码段中,没有任何表单导致内存泄漏.

但是,如果getNewMyClassInstance()以这种方式扩展定义而不是在范围退出时抛出异常,则第一个表单会导致内存泄漏:

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

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

使用这种形式(由函数返回的原始指针然后由智能指针获取),存在可能丢失内存的小间隙.几乎总是这不是问题,但它可能适合你.

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

std::shared_ptr<MyClass> MyClass::getNewMyClassInstance()
{
    return std::make_shared<MyClass>();
}
Run Code Online (Sandbox Code Playgroud)


UKM*_*key 5

我怀疑有人在做的是通过返回共享指针,确保指针始终由智能指针包装.通过返回一个裸指针; 这种保证丢失了; 从而使其对意外泄漏更加开放; 即

 { getNewMyClassInstance()->doStuff() }
Run Code Online (Sandbox Code Playgroud)

将在一个案件中泄漏; 但不是在另一个.

然而; 您发布的示例用法不会泄露.