c ++通过共享指针为struct member赋值会导致SIGSEGV

时间:2015-01-09 14:01:44

标签: c++ struct smart-pointers

美好的一天。自从90年代后期开始使用它以及我对新事物的速度越来越快时,我就更新了我的C ++知识。今天,我的问题是关于共享指针和结构。

这是我的代码:

#include <memory>

struct A {
    int x;
};

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

  return 0;
}

编译字符串:

g++ -Wall -Wpedantic --std=gnu++11 -g test.cpp -o test

valgrind memcheck注意到&#34;无效的写入大小为4&#34;在第11行,即y-> x = 0

所以,我的问题是:为什么写无效?我的理解 - 显然是错误的 - 是shared_ptr成语将为它所指向的东西处理内存的分配和解除分配,事实上,当我用它指向原始类型和类时,会发生这种情况。正如我所知道的,但是这种将它与结构一起使用的情况让我感到很沮丧。

我想弄清楚的真实用例是使用智能指针存储struct sockaddr_in,但我想我应该(重新)学习抓取之前我学会构建智能指针到智能指针被广泛接受之前的时间。

感谢。

4 个答案:

答案 0 :(得分:3)

shared_ptr<struct A> y;

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

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

auto y = std::make_shared<A>();
std::shared_ptr<A> y {new A};

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

答案 1 :(得分:2)

您仍然需要使用newstd::make_shared

分配对象

答案 2 :(得分:0)

使用此:

std::shared_ptr<struct A> p = std::make_shared<struct A>();

Shared_Ptr是原始指针的包装器,它不会为指针分配内存。

答案 3 :(得分:0)

您需要创建struct A的实例。然后使用指针y指向它。