如何最好地使用智能指针修复我的内存泄漏?

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);
}