我有以下代码片段:
struct Node
{
Node* left;
Node* right;
string data;
};
void test()
{
Node thing;
thing.data = "h";
thing.left = NULL;
thing.right = NULL;
cout<< "Thing data = " << thing.data << endl;
Node* thing2;
thing2->data = "f";
thing2->left = NULL;
thing2->right = NULL;
cout<< "Thing2 data = " << thing2->data << endl;
}
我遇到的问题是thing2-&gt; data =“f”在运行时产生分段错误。我通过GDB运行程序并得到此错误,但我无法弄清楚它的含义:
读取共享库的符号++。 DONE 事情数据= h
编程接收信号 EXC_BAD_ACCESS,无法访问 记忆。原因:13地址: 0x0000000000000000 0x00007fff874d59a3 在std :: string :: assign()
中
任何帮助都会很棒。谢谢!
答案 0 :(得分:2)
thing2是一个非初始化指针。 它没有指向有效的Node对象。
你应该分配它:
thing2 = new Node;
或使其指向有效的Node对象:
thing2 = & thing;
答案 1 :(得分:1)
thing2
是指向Node
的指针,但您没有指出任何内容:
Node* thing2 = new Node;
thing2->data = "f";
thing2->left = NULL;
thing2->right = NULL;
cout<< "Thing2 data = " << thing2->data << endl;
delete thing2;
上面的代码在堆上分配一个Node,并将其分配给thing2
。当它完成对象时,它会删除它。
更惯用的方法是使用智能指针:
#include <memory>
...
std::auto_ptr<Node> thing2(new Node);
thing2->data = "f";
thing2->left = NULL;
thing2->right = NULL;
cout<< "Thing2 data = " << thing2->data << endl;
由于auto_ptr
的析构函数删除了它所指向的内容,因此您无需显式删除该对象。
答案 2 :(得分:1)
thing2被声明为一个指针,你永远不会(通过new,malloc,甚至在堆栈上)分配该指针指向的实际节点。因此,node2指向显然位于程序地址空间之外的某些未知内存位,当您尝试通过thing2->data = "f"
调用修改该内存时,操作系统会通过禁止它来正确地保护自己(和您)。这就是seg。故障就是这样。