在二叉搜索树中初始化字符串数组

时间:2014-11-08 02:32:53

标签: c++ c string tree binary-search-tree

我的节点包含一个int和一个字符串变量,我尝试使用二叉搜索树。代码如下:

struct node{
int a;
string members[5];
};

int main(){
node * root = NULL;
root = (node*)malloc(sizeof(node));
root->members[0] = "aaaaa";
return 0;
}

当然,我的代码并不完全是这样的,我把它缩短为主要因为我想展示问题。它给了我访问违规写入位置'。我尝试使用' new node();'而不是malloc,而且没有发生。这究竟是为什么?

2 个答案:

答案 0 :(得分:1)

malloc()仅分配内存。它不会调用对象的构造函数。您可以使用例如

在已分配的内存上调用构造函数
void* mem = malloc(sizeof(node));
if (mem) {
    node* root = new(mem) node;
    // ...
}

使用new node代替malloc(sizeof(node)时,分配内存也会被初始化。使用未初始化的对象是未定义的行为。

答案 1 :(得分:1)

malloc仅分配原始存储空间。 new分配原始存储将其初始化为包含指定类型。

如果您只分配POD类型,那么这种区别主要是措辞,但所发生的情况几乎没有真正的区别。

如果您正在分配具有构造函数的std::string之类的内容,那么这就是一个与众不同的世界。如果您使用new,那么您的string变量都已初始化,因此它们是真实的(尽管仍为空)字符串。当您使用malloc时,它们尚未被初始化 - 它们只是未初始化的原始存储块,其大小合适,包含string。当您尝试将它们用作字符串时,快速崩溃就是您所希望的最佳状态。