对于此代码,C ++中有与智能指针相同的编码吗?
在External.cpp中:
class ExampleClass {...};
ExampleClass* function()
{
ExampleClass *ptr = new ExampleClass();
ptr->doSomething();
return ptr;
}
在Another.cpp中我想做这样的事情,怎么做?:
ExampleClass *ptr2 = function();
答案 0 :(得分:5)
实际上有两个,你可以使用unique_ptr或shared_ptr,看这里何时使用:Which kind of pointer do I use when?
如果您选择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();
答案 1 :(得分:1)
我不会真的推荐它,但你可以返回一个隐式转换为原始指针的对象。它会持续很短的时间,如果没有人抓住它,就删除它。
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 owner\n";
delete _ptr;
}
}
};
使用它很简单。它将在这个简单的情况下打包和解包指针:
RelinquishOrDelete function()
{
ExampleClass *ptr = new ExampleClass();
ptr->doSomething();
return {ptr};
}
// ...
ExampleClass *ptr2 = function();
但是,当然,如果在这段非常合理的代码中使用它,可能会导致意外行为:
auto ptr3 = function();
具有更严格的所有权语义的智能指针确实是最好的方法。