函数返回的临时unique_ptr句柄
A handle to temporary unique_ptr returned by function
我试图阅读一些关于对象所有权的文章,以及在复制构造本质上是被禁止的unique_ptr时如何应用一些例外。当然,我通过并通过引用返回它,因此不必涉及复制。
std::unique_ptr<T>& ptr_func(std::unique_ptr<T>& p) {
return p;
}
将指针的实例传递给此函数是没有问题的。它基本上进入函数并保持不变,无论它指向什么。
现在我的问题来了:假设我的兴趣指针指向一个包含多个属性的对象,而我只能以函数的返回值的形式检索该指针,例如
std::unique_ptr<T>& ptr_func() //say this function returns my pointer.
现在,假设检索这个指针需要相当多的计算(例如,通过迭代一个大向量(,我想设置/获取它指向的对象的许多不同的属性。然后,不能对它指向的指针或对象使用第二个(临时(句柄变得非常不切实际,因为我必须为每个操作调用返回指针的函数。编译器确实在一种已知情况下以某种方式创建了第二个引用:假设我将返回指针的函数作为参数传递给另一个函数,该函数更改了所指向对象的属性:
void set_attributes(std::unique_ptr ptr) {
ptr->change_something();
ptr->change_something_else();
}
这样:
void set_attributes(function_returning_pointer())
在这种情况下,function_returning_pointer((只调用一次,无论它的返回值在set_attributes((的主体中使用了多少次,这是如何工作的?
std::unique_ptr<T>& ptr_func()
是一个奇怪的签名:你可能会拥有所有权......或不。
您可能想要更清晰的功能:
T& get_ref();
T* get_ptr();
std::unique_ptr<T> take();
从您的使用情况来看,set_attributes
应该是:
void set_attributes(MyObject& ptr) {
ptr.change_something();
ptr.change_something_else();
}
用法类似于
assert(function_returning_pointer() != nullptr);
set_attributes(*function_returning_pointer());
assert(get_ptr() != nullptr);
set_attributes(*get_ptr());
set_attributes(get_ref());
auto ptr = take();
assert(ptr != nullptr);
set_attributes(*ptr); // set_attributes(*take()) would be useless as object would be destroyed.
如果您真的想在不转让所有权的情况下继续传递unique_ptr
,您的方法是:
void set_attributes(std::unique_ptr<MyObject>& ptr) { // prefer MyObject& or MyObject* instead
assert(ptr != nullptr);
ptr->change_something();
ptr->change_something_else();
}
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- GetModuleHandle() 无法检索由 "notepad.exe" 加载的"advapi32.dll"的句柄
- 更正GLSL无绑定纹理句柄中的结构布局
- 带有资源句柄的TensorFlow自定义C++操作