我有一个结构(应该用作二叉树叶):
struct node
{
string key;
long value;
struct node *left;
struct node *right;
};
我想初始化“node”类型的新对象并设置其属性。
void insert(string key, struct node **leaf)
{
if( *leaf == 0 )
{
*leaf = (struct node*) malloc( sizeof( struct node ));
(*leaf)->value = 1;
(*leaf)->key = key; // crash here
(*leaf)->left = 0;
(*leaf)->right = 0;
}
(........)
}
“long value”的设置值很好,但是当我尝试设置“string key”时,我的程序崩溃了,我得到了“访问冲突”。
为什么以及如何解决它?
答案 0 :(得分:3)
您必须使用operator new
而不是使用C函数malloc
来分配类型节点的新对象。在这种情况下,编译器将为类型为std::string
的数据成员键调用defalut构造函数。否则将不会构建数据成员密钥
例如
*leaf = new node { key, 1, 0, 0 };
或
*leaf = new node();
( *leaf )->key = key;
( *leaf )->value = 1;
左侧和右侧的数据成员将由新运算符初始化为零。
答案 1 :(得分:1)
malloc
未初始化类型。这意味着它不运行构造函数。 string
是一个具有构造函数的类类型。因此,在您的代码中,key
成员处于无效状态。因此,尝试使用它会导致问题。
你几乎不应该在C ++程序中使用malloc
。请改用new
。 new
旨在使用类类型并调用其构造函数。请记住,必须通过delete
代替free
来取消分配。