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

问题描述 投票:0回答:1

我偶然发现了这,它看起来像是内存泄漏:

void method(const string param) {
    if (auto* object = createObject(param))
        use(object);
}

如何最好地解决此内存泄漏?

我应该将返回的指针包装在唯一的指针中吗?

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构造函数正在传递原始指针,因此它不知道如何销毁所引用的对象。这就是为什么我认为最好从createObject中代替return唯一指针:

void method(const string param) {
    if (auto object = createObject(param))
        use(object.get());
}
std::unique_ptr<Object> createObject(){ return std::make_unique<Object>(...); }

根据我的阅读,无论Object是什么,这现在都应该成功地解构。使用原始指针返回来构造唯一指针实际上是否不好?看来参考显然不再是唯一的。

在两种情况下,使用都需要Object*,所以我必须使用object.get()-我不知道这是否正常。

处理这种情况的一般共识是什么?

c++ pointers smart-pointers unique-ptr
1个回答
0
投票
owning原始指针,非拥有的原始指针是

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

当您检查nullptruse时,通过引用传递比通过指针传递更合适:

void use(Object&);
void method(const std::string& param)
{
    if (auto object = createObject(param))
        use(*object);
}
© www.soinside.com 2019 - 2024. All rights reserved.