将字符串值赋给指向struct的指针中的属性

时间:2014-06-21 15:02:22

标签: c++

我有一个结构(应该用作二叉树叶):

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”时,我的程序崩溃了,我得到了“访问冲突”。

为什么以及如何解决它?

2 个答案:

答案 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。请改用newnew旨在使用类类型并调用其构造函数。请记住,必须通过delete代替free来取消分配。