智能指针等效



在C++中,此代码的智能指针有等效的编码吗?

在外部.cpp中:

class ExampleClass {...};
ExampleClass* function()
{
ExampleClass *ptr = new ExampleClass();
ptr->doSomething();
return ptr;
}

在另一个.cpp我想正确地做这样的事情,如何?

ExampleClass *ptr2 = function();

实际上有两个,您可以使用unique_ptr或shared_ptr,看看这里什么时候使用哪个: 我什么时候使用哪种指针?

如果您选择unique_ptr,那么您将得到:

class ExampleClass {...};
std::unique_ptr<ExampleClass> function()
{
std::unique_ptr<ExampleClass> uptr = std::make_unique<ExampleClass>();
uptr->doSomething();
return std::move(uptr);
}
//In Another.cpp 
std::unique_ptr<ExampleClass> ptr2 = function();
//you could even store the result in a shared pointer!!
std::shared_ptr<ExampleClass> ptr3 = function();

我真的不推荐它,但您可以返回一个隐式转换为原始指针的对象。它将在短时间内拥有它,如果没有人抓住它,则删除它。

struct RelinquishOrDelete {
ExampleClass *_ptr;
operator ExampleClass*() { auto ret = _ptr; _ptr = nullptr; return ret; }
~RelinquishOrDelete() {
if(!_ptr) { 
cerr << "returned object wasn't taken by a new ownern";
delete _ptr;
}
}
};

使用它很简单。在这种简单的情况下,它将打包和解压缩指针:

RelinquishOrDelete function()
{
ExampleClass *ptr = new ExampleClass();
ptr->doSomething();
return {ptr};
}
// ...
ExampleClass *ptr2 = function();

但是,当然,如果在这个完全合理的代码段中使用,它可能会导致意外行为:

auto ptr3 = function();

具有更严格所有权语义的智能指针确实是最好的方法。

相关内容

  • 没有找到相关文章

最新更新