我偶然发现了这,它看起来像是内存泄漏:
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()
-我不知道这是否正常。
处理这种情况的一般共识是什么?
“ 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());
}
当您检查nullptr
的use
时,通过引用传递比通过指针传递更合适:
void use(Object&);
void method(const std::string& param)
{
if (auto object = createObject(param))
use(*object);
}