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

C++ 如何最好地使用智能指针修复内存泄漏?,c++,pointers,smart-pointers,unique-ptr,C++,Pointers,Smart Pointers,Unique Ptr,我偶然发现了这个,看起来像是内存泄漏: void方法(常量字符串参数){ 如果(自动*对象=创建对象(参数)) 使用(对象); } 如何最好地修复此内存泄漏 我应该将返回的指针包装为唯一指针吗 void方法(常量字符串参数){ if(auto object=std::unique_ptr(createObject(param)) 使用(object.get()); } 或: void方法(常量字符串参数){ if(std::unique_ptr object{createObject(par

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

void方法(常量字符串参数){
如果(自动*对象=创建对象(参数))
使用(对象);
}
如何最好地修复此内存泄漏

我应该将返回的指针包装为唯一指针吗

void方法(常量字符串参数){
if(auto object=std::unique_ptr(createObject(param))
使用(object.get());
}
或:

void方法(常量字符串参数){
if(std::unique_ptr object{createObject(param)})
使用(object.get());
}
如果C++的类型推断类似java的话,那就好了,允许类似的事情:

auto object=std::unique_ptr(createObject())

std::unique_ptr对象{createObject()};

我担心的一个问题是
unique\u ptr
构造函数被传递了一个原始指针,因此它不知道如何销毁引用的对象。这就是为什么我认为最好从
createObject
返回一个唯一指针:

void方法(常量字符串参数){
如果(自动对象=创建对象(参数))
使用(object.get());
}
std::unique_ptr createObject(){return std::make_unique(…);}
从我所读到的内容来看,无论
对象是什么,现在都应该成功地解构它。使用原始指针来构造唯一指针是否真的不好?似乎引用显然不再是唯一的

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


处理这种情况的普遍共识是什么?

您应该避免拥有原始指针,不拥有原始指针是“好的”(注意,我们不知道指针是否拥有)

最好是改变

Object* createObject(const std::string& param) { return new Object(param); }
进入

在检查
use
nullptr
时,通过引用传递可能比通过指针传递更合适:

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

用@AlanBirtles
std::array createObject(){return new std::array;};int main(){auto*object=createObject();}回答您的问题会更容易
返回一个
唯一的\u ptr
确实是一个非常好的主意。这使得返回对象的所有权语义非常清晰。尽可能避免传递原始指针,除非非所有权转移视图有意义,如
use()
unique_ptr
s作为参数,而不仅仅是一个
对象
,这有意义吗?此外,如果我返回一个唯一指针,这意味着我不能在其他任何地方使用该对象,但使用/移动范围之间的唯一指针返回的范围会产生大量开销?
void use(Object*);
void method(const std::string& param)
{
    if (auto object = createObject(param))
        use(object.get());
}
void use(Object&);
void method(const std::string& param)
{
    if (auto object = createObject(param))
        use(*object);
}