我的节点包含一个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,而且没有发生。这究竟是为什么?
答案 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
。当您尝试将它们用作字符串时,快速崩溃就是您所希望的最佳状态。