gpt4 book ai didi

c++ - 通过非智能指针参数将智能指针传递给函数

转载 作者:行者123 更新时间:2023-12-04 01:03:28 26 4
gpt4 key购买 nike

考虑以下函数:

void example(void **ptr){
std::cout << *ptr << "\n"; // pointer value
std::cout << ptr << "\n"; // pointer address
std::cout << **reinterpret_cast<int**>(ptr); // value
}

函数签名无法更改

下面的代码是否有效,还是我应该使用原始指针?

int main() 
{
std::unique_ptr<int> x = std::make_unique<int>(20);
std::cout << x.get() << "\n"; // pointer value
std::cout << &x << "\n"; // pointer address
example(reinterpret_cast<void**>(&x));
}

Live sample

最佳答案

它无效并且具有未定义的行为。
(如果它看起来有效,那是因为您的特定实现恰好将 unique_ptr 的底层指针存储为其在这种特定情况下的第一个成员。尽管如此,它仍然是 100% 纯 Crystal 般清晰的未定义行为。)

如果您不能更改函数,则需要向它传递一些实际上是 int** 的东西- &xstd::unique_ptr<int>* , 再多的类型转换也无法产生有效的 int**从它。
(我发现将智能“指针”视为指针通常是错误的。)

在智能“指针”中获取指向底层对象的指针的方法是通过get() :

int* p = x.get();

然后你可以传递一个指向p的指针(不过你仍然需要施放它):

example(reinterpret_cast<void**>(&p));

关于c++ - 通过非智能指针参数将智能指针传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67316221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com