构造函数初始化列表中的共享指针
shared pointer in constructor initializer list
我创建了一个共享指针,如下所示
typedef std::shared_ptr<int> int_ptr;
int main()
{
int_ptr my_int_ptr();
std::cout << *my_int_ptr << std::endl;
}
此代码的输出是 1。我不确定 1 is getting 是如何打印出来的。它正在打印一些垃圾吗?
Okie 现在它打印了一些值,这意味着它存在适当的内存。
现在应用相同的概念,但这次我的共享指针是 class 的成员,我在构造函数成员初始化列表中初始化它。代码如下。
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 函数和取消引用共享指针时遇到了分段错误。
我无法理解幕后发生的事情。
有人可以帮我解决以下问题吗?
- 如何打印 1?
- 为什么会发生段错误?
shared_ptr 的默认构造函数导致空指针。这就是取消引用它的结果未定义的原因。如果您想获得一个指向默认值为 0 的新创建的 int 的指针,您应该尝试 int_ptr my_int_ptr = std::make_shared<int>()
。
访问未分配的 shared_ptr<>
的分段错误是完全正常的,因为您实际上是在取消引用 null
。
有趣的是为什么您的第一个测试没有崩溃。
int_ptr my_int_ptr();
这行代码并不像您想象的那样。您正在向前声明一个名为 my_int_ptr
的函数,它是 returns 一个 int_ptr
,而不是声明 int_ptr
.
的 default-initialized 实例
我创建了一个共享指针,如下所示
typedef std::shared_ptr<int> int_ptr;
int main()
{
int_ptr my_int_ptr();
std::cout << *my_int_ptr << std::endl;
}
此代码的输出是 1。我不确定 1 is getting 是如何打印出来的。它正在打印一些垃圾吗?
Okie 现在它打印了一些值,这意味着它存在适当的内存。
现在应用相同的概念,但这次我的共享指针是 class 的成员,我在构造函数成员初始化列表中初始化它。代码如下。
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 函数和取消引用共享指针时遇到了分段错误。
我无法理解幕后发生的事情。
有人可以帮我解决以下问题吗?
- 如何打印 1?
- 为什么会发生段错误?
shared_ptr 的默认构造函数导致空指针。这就是取消引用它的结果未定义的原因。如果您想获得一个指向默认值为 0 的新创建的 int 的指针,您应该尝试 int_ptr my_int_ptr = std::make_shared<int>()
。
访问未分配的 shared_ptr<>
的分段错误是完全正常的,因为您实际上是在取消引用 null
。
有趣的是为什么您的第一个测试没有崩溃。
int_ptr my_int_ptr();
这行代码并不像您想象的那样。您正在向前声明一个名为 my_int_ptr
的函数,它是 returns 一个 int_ptr
,而不是声明 int_ptr
.