C++ 通过非智能指针参数向函数传递智能指针
考虑以下功能:C++ 通过非智能指针参数向函数传递智能指针,c++,c++11,smart-pointers,C++,C++11,Smart Pointers,考虑以下功能: void example(void **ptr){ std::cout << *ptr << "\n"; // pointer value std::cout << ptr << "\n"; // pointer address std::cout << **reinterpret_c
void example(void **ptr){
std::cout << *ptr << "\n"; // pointer value
std::cout << ptr << "\n"; // pointer address
std::cout << **reinterpret_cast<int**>(ptr); // value
}
void示例(void**ptr){
std::cout通常只有void*
在使用演员扮演有趣游戏时才具有特殊权利和特权。但是,考虑到您必须处理的情况:
example(reinterpret_cast<void**>(&x));
现在您有了一个std::unique\u ptr*
可供使用。您可以按照原始计划进行操作。如果您愿意,下一步可以是:
auto &x=*xptr;
而且这个x
与您的main
中的x
是相同的,实际上是一样的。它是无效的,并且具有未定义的行为。
(如果它看起来有效,那是因为您的特定实现碰巧将unique\u ptr
的底层指针存储为它在这种特定情况下的第一个成员。不过,它仍然是100%完全清晰的未定义行为。)
如果你不能改变函数,你需要传递一个实际上是int**
-&x
是std::unique.\u ptr*
,再多的强制转换也不能从中得到一个有效的int**
。
(我发现将智能“指针”视为指针通常是错误的。)
在智能“指针”中获取指向底层对象的指针的方法是通过get()
:
然后,您可以将指针传递到p
(不过您仍然需要强制转换它):
示例(重新解释演员阵容(&p));
示例
是否需要拥有唯一的\u ptr
?如果不需要,那么即使没有无效**
的复杂性,也可以将原始数据传递给它pointer@AlanBirtles它不需要拥有所有权,只是一个内存管理的问题。它是有意义的。它是否正确取决于函数实际上期望其参数为。这是通常的处理值的简单示例:**reinterpret_cast(ptr)=30;
Ifexample()
需要一个指向int
的指针,然后从unique\u ptr
中获取int*
,将其存储在一个普通的int*
中,然后传递一个指向该变量的指针,并将其转换为void**
。为了获得有关堆栈溢出的有用答案,有必要问一个有用的问题。不,不是。如果指向unique_ptr
的指针被解释为指向某个值的指针,那么标准中没有任何东西可以保证定义的行为。我概述了几种尽可能在定义的行为范围内的方法。我相信其中一种方法,无论是逐字逐句,还是稍加修改,都将我在这里工作。这是一个合理的观点,我的问题源于这样一个事实:到目前为止,我在对象中执行的所有操作都呈现了预期的结果,但由于这是UB的特性之一,这让我提出了一个问题。我测试过的所有编译器似乎都能够执行预期的操作。第一个unique\u ptr
的成员(可能仅此)可能只是一个指针,因此将其投射到int**
可能会起作用,但这肯定是未定义的行为,你只是运气好/运气不好而已
void example(void **ptr)
{
auto x_ptr = reinterpret_cast<std::unique_ptr<int> *>(ptr);
auto &x=*xptr;
int* p = x.get();
example(reinterpret_cast<void**>(&p));