将智能指针传递给引用指针参数的函数
passing smart pointer to a function taking reference to a pointer parameter
如何将智能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;
}
编辑现在我明白了。谢谢大家的回答!
简单的答案是你不能。而智能指针几乎可以肯定的是,内部某处包含一个T*
指针强制执行各种不变量,其中许多可以是如果您可以在不通过的情况下更改此指针,则该指针已断开用户界面。唯一的解决方案是调用函数使用原始指针,然后使用原始指针进行初始化提供的智能指针确保您得到的满足智能指针的要求(例如。由new
运营商分配)。
Ugh,这个API很难看。
我假设函数承诺它"返回"的指针拥有一个资源,该资源将被调用方以smart_ptr
的方式删除,并且smart_ptr
可以从任意指针初始化。否则是做不到的。
你可以像在没有智能指针的情况下那样抓取指针,然后把它放在智能指针中。
T* ptr;
Foo(ptr);
smart_ptr<T> val(ptr);
可能是智能指针已经拥有某个东西,并且您希望将该东西传递给函数,然后替换智能指针拥有的东西。那是。。。更丑陋。
我不知道该函数是否会获得您传入的资源的所有权(通常情况下,我预计不会,但由于API如此丑陋,我不会发誓)。这导致了两种不同的情况。
如果函数拥有您传递的资源的所有权,即它关心删除指针本身,则智能指针类型必须是可以放弃资源所有权的类型,如具有release()
成员函数的std::unique_ptr
。值得注意的是,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);
你不能那样做。您可以使用"T* raw = val.get()
"然后使用"Foo(raw)
"来传递原始指针,但不能像在Foo
中那样设置shared_ptr
的原始指针。如果希望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
,而不是通过引用获取它。
- 为函数定义符号不明确的指针参数
- 构造函数 (C++) 中的 char 指针参数存在问题
- 按引用调用与按指针参数调用的差异 前递增和后递增
- 为什么具有指针参数的成员函数需要指向指针的指针?
- 通过引用函数传递指针参数是什么意思?
- 从double到double*的指针参数
- void 函数中的指针参数返回不一致的值
- 无法向上转换指针到指针参数
- 将数组动态分配到具有指针参数的函数中
- 模板函数指针参数与构造函数参数
- 使用通用函数指针参数化函数模板的简洁方法
- 如何为C++字符串分配空指针参数?
- C++带有指针参数的函数
- 指针参数的默认值
- 将常量添加到函数模板指针参数
- 如何传递unique_ptr<T>代替原始*输出*指针参数?
- 不带星号的函数指针参数
- 功能指针参数参数转换为const
- 将指针参数传递给双指针参数
- 如何调试指针参数是否通过函数修改