将智能指针传递给参考指针参数的函数

时间:2013-07-23 14:11:31

标签: c++ smart-pointers

如何将智能ptr传递给参考指针作为参数的函数?

smart_ptr<T> val; // I have this smart pointer

// And I want to pass it to this function, so that this function will fill the smart pointer with proper value
void Foo(T*& sth)
{
    sth = memoryAddress;
}

EDIT 现在我懂了。谢谢大家的所有答案!

3 个答案:

答案 0 :(得分:7)

简单的答案是,你做不到。而智能指针 几乎可以肯定,内部有一个T*,聪明 指针强制执行各种不变量,其中许多可能是 如果你可以改变这个指针而不通过就破了 用户界面。唯一的解决方案是调用该函数 使用原始指针,然后使用原始指针进行初始化 智能指针提供,你确定指针 你得到满足智能指针的要求(例如 由new运营商分配。

答案 1 :(得分:4)

呃,这个API太丑了。

我将假设函数承诺指针它“返回”拥有一个资源,该资源将由调用者以smart_ptr这样做的方式删除,并且smart_ptr可以初始化来自任意指针。不能这样做。

你可以像没有智能指针一样抓住指针,然后把它放在智能指针中。

T* ptr;
Foo(ptr);
smart_ptr<T> val(ptr);

情况可能是智能指针已经拥有某些内容并且您希望将该内容传递给该函数,然后替换智能指针所拥有的内容。那是......甚至更丑。

我不知道该函数是否会获取您传入的资源的所有权(通常,我不希望这样,但由于API很丑陋,我不会发誓)。这导致了两种不同的情况。

如果函数获取您传递的资源的所有权,即它关心删除指针本身,则智能指针类型必须是可以放弃资源所有权的类型,例如std::unique_ptr release()成员函数。值得注意的是,std::shared_ptr无法做到这一点(考虑到其他shared_ptr也可能拥有它)。

因此,假设智能指针具有该功能,并且能够重新初始化为任意指针(如std::unique_ptr::reset),您可以执行以下操作:

//smart_ptr<T> val;
T* ptr = val.release();
Foo(ptr);
val.reset(ptr);

如果该函数没有获取资源的所有权,那么所需的只是能够使用任意指针重新初始化。

//smart_ptr<T> val;
T* ptr = val.get();
Foo(ptr);
val.reset(ptr);

答案 2 :(得分:1)

你做不到。您可以使用“T* raw = val.get()”然后“Foo(raw)”传递原始指针,但不能在shared_ptr内设置Foo的原始指针。如果您希望Foo设置shared_ptr,请将其设为非常量shared_ptr

像这样:

template<typename T>
Foo(shared_ptr<T>& ptr)
{
    ptr.reset(memoryAddress); // Or assign it, or make_shared, or whatever.
}

shared_ptr<int> intptr;
Foo(intptr);

或者更好的是,让Foo返回shared_ptr而不是参考。