我创建了一个像下面这样的共享指针
typedef std::shared_ptr<int> int_ptr;
int main()
{
int_ptr my_int_ptr();
std::cout << *my_int_ptr << std::endl;
}
此代码的输出为1.我不确定如何打印1。这是打印的垃圾吗?
Okie从现在开始打印了一些值,这意味着存在适当的内存。
现在应用同样的概念,但这次我的共享指针是类的成员,我在构造函数成员初始化列表中初始化它。代码如下。
typedef std::shared_ptr<int> int_ptr;
class MyInt
{
public:
MyInt():m_myint_ptr(){
}
void show() {
std::cout << *m_myint_ptr << std::endl;
}
private:
int_ptr m_myint_ptr;
};
int main()
{
MyInt my_int;
my_int.show();
}
但这次我调用show函数时会出现分段错误,并且共享指针被解除引用。
我无法理解最新情况。
有人可以帮我解决以下问题吗?
答案 0 :(得分:2)
访问未分配的shared_ptr<>
的分段错误完全正常,因为您基本上是取消引用null
。
有趣的是为什么你的第一次测试没有崩溃。
int_ptr my_int_ptr();
这行代码不符合您的想法。您正在声明一个名为my_int_ptr
的函数,该函数返回int_ptr
,而不是声明默认初始化的int_ptr
实例。
答案 1 :(得分:1)
shared_ptr的默认构造函数导致空指针。这就是解除引用它的结果未定义的原因。如果您想获得一个指向新创建的int的指针,默认值为0,那么您应该尝试使用int_ptr my_int_ptr = std::make_shared<int>()
。