智能指针无法自动转为裸指针?如何修正相关编译错误?
解决智能指针无法传递给裸指针参数的问题
嗨,这个问题其实是C++智能指针的一个设计特性——std::unique_ptr这类智能指针不会隐式转换为裸指针,目的就是为了避免不小心泄露内存所有权,或者产生悬空指针的风险。
要解决你的问题,只需要调用智能指针的get()方法,它会返回智能指针当前管理的裸指针,而且不会转移内存的所有权,正好适配printer这种只需要临时使用指针、不需要接管内存的场景。
修改后的完整代码如下:
#include <iostream> #include <string> #include <memory> void printer(int* x) { std::cout << "x = " << *x << std::endl; // 注:如果原本想打印指针地址,保留`x`即可;如果想打印值,需要加解引用`*x` } int main() { auto x = std::make_unique<int>(5); printer(x.get()); // 使用get()获取裸指针 return 0; }
几个需要注意的点:
- 不要把
get()返回的裸指针长期存储,因为智能指针可能会在任意时刻(比如被重置、销毁)释放内存,导致这个裸指针变成悬空指针。 - 不管是
std::unique_ptr还是std::shared_ptr,都可以用get()方法获取对应的裸指针,逻辑完全一致。 - 如果你的
printer函数需要修改指针指向的内容,get()同样适用,只要确保在使用该指针的期间,智能指针没有被销毁或重置就行。
内容的提问来源于stack exchange,提问作者kzaiwo
相关产品推荐
相关产品推荐

