如何最好地使用智能指针修复我的内存泄漏?
How best can I fix my memory leak using smart pointers?
我偶然发现了这个,看起来像是内存泄漏:
void method(const string param) {
if (auto* object = createObject(param))
use(object);
}
如何最好地修复此内存泄漏?
我应该将 returned 指针包装在一个唯一指针中吗?
void method(const string param) {
if (auto object = std::unique_ptr<Object>(createObject(param))
use(object.get());
}
或:
void method(const string param) {
if (std::unique_ptr<Object> object{createObject(param)})
use(object.get());
}
如果 C++ 具有类似于 Java 的类型推断,那么就很好了:
auto object = std::unique_ptr<>(createObject())
或
std::unique_ptr<> object{createObject()};
我担心的是 unique_ptr
构造函数被传递了一个原始指针,所以它不知道如何销毁引用的对象。这就是为什么我认为用 return 来自 createObject
:
的唯一指针可能会更好
void method(const string param) {
if (auto object = createObject(param))
use(object.get());
}
std::unique_ptr<Object> createObject(){ return std::make_unique<Object>(...); }
根据我的阅读,无论 Object
是什么,这现在应该可以成功解构。 return 使用原始指针构造唯一指针真的很糟糕吗?似乎引用显然不再是唯一的。
在这两种情况下,使用都需要 Object*
所以我必须使用 object.get()
- 我不知道这是否正常。
处理这种情况的普遍共识是什么?
你应该避免拥有原始指针,非拥有原始指针是"fine"(注意我们不不知道指针是否拥有。
最好是改变
Object* createObject(const std::string& param) { return new Object(param); }
进入
std::unique_ptr<Object> createObject(const std::string& param)
{
return std::make_unique<Object>(param);
}
那么用法确实可以和你的提议类似:
void use(Object*);
void method(const std::string& param)
{
if (auto object = createObject(param))
use(object.get());
}
当您为 use
检查 nullptr
时,通过引用传递可能比通过指针传递更合适:
void use(Object&);
void method(const std::string& param)
{
if (auto object = createObject(param))
use(*object);
}
我偶然发现了这个,看起来像是内存泄漏:
void method(const string param) {
if (auto* object = createObject(param))
use(object);
}
如何最好地修复此内存泄漏?
我应该将 returned 指针包装在一个唯一指针中吗?
void method(const string param) {
if (auto object = std::unique_ptr<Object>(createObject(param))
use(object.get());
}
或:
void method(const string param) {
if (std::unique_ptr<Object> object{createObject(param)})
use(object.get());
}
如果 C++ 具有类似于 Java 的类型推断,那么就很好了:
auto object = std::unique_ptr<>(createObject())
或
std::unique_ptr<> object{createObject()};
我担心的是 unique_ptr
构造函数被传递了一个原始指针,所以它不知道如何销毁引用的对象。这就是为什么我认为用 return 来自 createObject
:
void method(const string param) {
if (auto object = createObject(param))
use(object.get());
}
std::unique_ptr<Object> createObject(){ return std::make_unique<Object>(...); }
根据我的阅读,无论 Object
是什么,这现在应该可以成功解构。 return 使用原始指针构造唯一指针真的很糟糕吗?似乎引用显然不再是唯一的。
在这两种情况下,使用都需要 Object*
所以我必须使用 object.get()
- 我不知道这是否正常。
处理这种情况的普遍共识是什么?
你应该避免拥有原始指针,非拥有原始指针是"fine"(注意我们不不知道指针是否拥有。
最好是改变
Object* createObject(const std::string& param) { return new Object(param); }
进入
std::unique_ptr<Object> createObject(const std::string& param)
{
return std::make_unique<Object>(param);
}
那么用法确实可以和你的提议类似:
void use(Object*);
void method(const std::string& param)
{
if (auto object = createObject(param))
use(object.get());
}
当您为 use
检查 nullptr
时,通过引用传递可能比通过指针传递更合适:
void use(Object&);
void method(const std::string& param)
{
if (auto object = createObject(param))
use(*object);
}