Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过非智能指针参数向函数传递智能指针_C++_C++11_Smart Pointers - Fatal编程技术网

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;
If
example()
需要一个指向
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));