c ++通过共享指针为struct成员赋值导致SIGSEGV

Tee*_*eej 2 c++ struct smart-pointers

再会。自 90 年代末以来我没有使用 C++ 知识后,我正在更新我的 C++ 知识,并且正在快速了解新事物。今天,我的问题是关于共享指针和结构。

这是我的代码:

#include <memory>

struct A {
    int x;
};

int main() {
  shared_ptr<struct A> y;
  y->x =0;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译字符串:

g++ -Wall -Wpedantic --std=gnu++11 -g test.cpp -o test
Run Code Online (Sandbox Code Playgroud)

valgrind memcheck 指出第 11 行有一个“大小为 4 的无效写入”,即 y->x = 0

所以,我的问题是:为什么会有无效写入?我的理解——显然是错误的——是 shared_ptr 惯用语将处理它所指向的东西的内存分配和解除分配,而且据我所知,当我使用它指向原始类型和类时,确实会发生这种情况,但是这种将它与结构一起使用的情况让我感到困惑。

我试图弄清楚的真正用例是使用智能指针来存储结构 sockaddr_in,但我认为我应该(重新)学习爬行,然后再学习构建指向智能指针之前定义的对象的智能指针一个被广泛接受的东西。

谢谢。

Mik*_*our 5

shared_ptr<struct A> y;
Run Code Online (Sandbox Code Playgroud)

这是一个指针,它不指向(或拥有)任何对象。你不能取消引用它。

您需要创建一个由指针管理的对象,例如:

auto y = std::make_shared<A>();
std::shared_ptr<A> y {new A};
Run Code Online (Sandbox Code Playgroud)

第一个通常是首选,因为它可以更有效地分配内存。