初始化二进制搜索树中的字符串数组

initializing array of string in binary search tree

本文关键字:字符串 数组 二进制 搜索树 初始化      更新时间:2023-10-16

我的节点包含一个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,但这并没有发生。这到底是为什么?

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

void* mem = malloc(sizeof(node));
if (mem) {
    node* root = new(mem) node;
    // ...
}

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

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

如果你只分配POD类型,这种区别主要是措辞上的区别,在发生的事情上几乎没有真正的区别。

如果你正在分配像std::string这样有构造函数的东西,那就有很大的不同了。如果使用new,那么string变量都已初始化,因此它们是真实的(尽管仍然是空的)字符串。当您只使用malloc时,它们根本没有初始化——它们只是未初始化的原始存储块,大小适合包含string。当你试图将它们用作字符串时,快速崩溃是你所能期望的最好结果。