【问题标题】:initializing array of string in binary search tree在二叉搜索树中初始化字符串数组
【发布时间】:2014-11-08 02:32:53
【问题描述】:

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

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

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

当然,我的代码并不完全一样,我把它写在 main 中是因为我只想展示问题所在。它给了我“访问违规写作位置”。我尝试使用“新节点();”而不是 malloc 并没有发生。为什么会这样?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我现在明白了:D 所以问题就在那里,因为字符串是一个类。我在这里忽略了一个重要的事实,哈哈。谢谢你:D
    • @Rei:实际上,从概念上讲,C++ 中的所有对象都需要使用new 构造。对于某些类型(POD),它也可以分配内存,但new这些对象并没有错,这样做实际上比使用malloc()更简单。
    【解决方案2】:

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

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

    如果您要分配像 std::string 这样的具有构造函数的东西,那么就会有天壤之别。如果您使用new,那么您的string 变量已全部初始化,因此它们是真实的(尽管仍然是空的)字符串。当您只使用malloc 时,它们根本没有被初始化——它们只是未初始化的原始存储块,大小合适以包含string。当您尝试将它们用作字符串时,快速崩溃是您所希望的最好结果。

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多