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)
关于内存泄漏?
有一个微妙的区别.
每当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)
我怀疑有人在做的是通过返回共享指针,确保指针始终由智能指针包装.通过返回一个裸指针; 这种保证丢失了; 从而使其对意外泄漏更加开放; 即
{ getNewMyClassInstance()->doStuff() }
Run Code Online (Sandbox Code Playgroud)
将在一个案件中泄漏; 但不是在另一个.
然而; 您发布的示例用法不会泄露.
归档时间: |
|
查看次数: |
164 次 |
最近记录: |