通过非智能指针参数将智能指针传递给函数
Passing smart pointer to function through non smart pointer argument
考虑以下函数:
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));
}
通常只有 void *
在玩带演员的有趣游戏时享有特殊权利和特权。但是,鉴于您必须处理的情况:
example(reinterpret_cast<void**>(&x));
请注意,您正在传递 &x
并使用 reinterpret_cast
清洗它。在 example()
中你应该做相反的事情:
void example(void **ptr)
{
auto x_ptr = reinterpret_cast<std::unique_ptr<int> *>(ptr);
现在您可以使用 std::unique_ptr<int> *
。你可以按照你原来的计划进行。如果您愿意,您的下一步可以是:
auto &x=*xptr;
并且这个 x
与您 main
中的 x
相同,出于所有实际目的(确实如此)。
它无效并且具有未定义的行为。
(如果它看起来有效,那是因为你的特定实现恰好将 unique_ptr
的底层指针存储为它在这种特定情况下的第一个成员。它仍然是 100% 纯 crystal-清除未定义的行为,不过。)
如果你不能改变这个函数,你需要给它传递一些实际上是 int**
- &x
是 std::unique_ptr<int>*
的东西,再多的转换也无济于事来自它的有效 int**
。
(我发现将智能“指针”视为指针通常是错误的。)
在智能“指针”中获取指向底层对象的指针的方法是通过get()
:
int* p = x.get();
然后你可以传递一个指向 p
的指针(不过你仍然需要转换它):
example(reinterpret_cast<void**>(&p));
考虑以下函数:
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));
}
通常只有 void *
在玩带演员的有趣游戏时享有特殊权利和特权。但是,鉴于您必须处理的情况:
example(reinterpret_cast<void**>(&x));
请注意,您正在传递 &x
并使用 reinterpret_cast
清洗它。在 example()
中你应该做相反的事情:
void example(void **ptr)
{
auto x_ptr = reinterpret_cast<std::unique_ptr<int> *>(ptr);
现在您可以使用 std::unique_ptr<int> *
。你可以按照你原来的计划进行。如果您愿意,您的下一步可以是:
auto &x=*xptr;
并且这个 x
与您 main
中的 x
相同,出于所有实际目的(确实如此)。
它无效并且具有未定义的行为。
(如果它看起来有效,那是因为你的特定实现恰好将 unique_ptr
的底层指针存储为它在这种特定情况下的第一个成员。它仍然是 100% 纯 crystal-清除未定义的行为,不过。)
如果你不能改变这个函数,你需要给它传递一些实际上是 int**
- &x
是 std::unique_ptr<int>*
的东西,再多的转换也无济于事来自它的有效 int**
。
(我发现将智能“指针”视为指针通常是错误的。)
在智能“指针”中获取指向底层对象的指针的方法是通过get()
:
int* p = x.get();
然后你可以传递一个指向 p
的指针(不过你仍然需要转换它):
example(reinterpret_cast<void**>(&p));