c ++通过共享指针为结构成员赋值导致SIGSEGV
c++ assigning value to struct member through shared pointer causes SIGSEGV
美好的一天。自从 90 年代后期以来就没有使用过 C++ 知识后,我正在更新我的 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 注意到第 11 行有一个 "Invalid write of size 4",即 y->x = 0
所以,我的问题是:为什么会出现无效写入?我的理解——显然是错误的——是 shared_ptr 习惯用法将处理它所指向的事物的内存分配和取消分配,实际上当我用它指向原始类型和 类 据我所知,但这种将它与结构一起使用的情况让我很困惑。
我想弄清楚的真正用例是使用智能指针来存储结构 sockaddr_in,但我认为在学习构建智能指针之前我应该(重新)学习爬行在智能指针被广泛接受之前定义的对象。
谢谢。
您仍然需要使用 new
或 std::make_shared
分配您的对象
使用这个:
std::shared_ptr<struct A> p = std::make_shared<struct A>();
Share_Ptr 是原始指针的包装器,它不为指针分配内存。
shared_ptr<struct A> y;
这是一个空指针,它不指向(或拥有)任何对象。你不能取消引用它。
您需要创建一个由指针管理的对象,例如:
auto y = std::make_shared<A>();
std::shared_ptr<A> y {new A};
通常首选第一个,因为它可以更有效地分配内存。
您需要创建结构 A 的实例。然后用指针 y 指向它。
美好的一天。自从 90 年代后期以来就没有使用过 C++ 知识后,我正在更新我的 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 注意到第 11 行有一个 "Invalid write of size 4",即 y->x = 0
所以,我的问题是:为什么会出现无效写入?我的理解——显然是错误的——是 shared_ptr 习惯用法将处理它所指向的事物的内存分配和取消分配,实际上当我用它指向原始类型和 类 据我所知,但这种将它与结构一起使用的情况让我很困惑。
我想弄清楚的真正用例是使用智能指针来存储结构 sockaddr_in,但我认为在学习构建智能指针之前我应该(重新)学习爬行在智能指针被广泛接受之前定义的对象。
谢谢。
您仍然需要使用 new
或 std::make_shared
使用这个:
std::shared_ptr<struct A> p = std::make_shared<struct A>();
Share_Ptr 是原始指针的包装器,它不为指针分配内存。
shared_ptr<struct A> y;
这是一个空指针,它不指向(或拥有)任何对象。你不能取消引用它。
您需要创建一个由指针管理的对象,例如:
auto y = std::make_shared<A>();
std::shared_ptr<A> y {new A};
通常首选第一个,因为它可以更有效地分配内存。
您需要创建结构 A 的实例。然后用指针 y 指向它。