访问使用malloc分配的C ++对象的成员?

时间:2012-01-08 00:03:02

标签: c++ malloc

[编者注:我已经编辑了标题,试图在将来对其他人有用。为了给回答者一个信誉,这只是“为什么这不起作用?”他们回答的问题!]

以下代码在top -> ...行崩溃时出现分段错误,无论Node*尝试将哪些代码推送到向量子代上。有谁知道可能导致这种情况的原因?

struct Node
{
    string data;
    struct Node* parent;
    vector<struct Node*> children;
};

struct Node* push(string word, struct Node* top)
{
    Node* temp = (struct Node*) malloc(sizeof(struct Node));
    temp -> data = word;
    temp -> parent = top;
    return temp;
}

int main()
{
    Node* top = push("blah", NULL);
    Node* temp = NULL;
    top -> children.push_back(temp);
}

5 个答案:

答案 0 :(得分:5)

问题是malloc不会调用构造函数。而且你依靠要构建的向量children

替换:

Node* temp = (struct Node*) malloc(sizeof(struct Node));

使用:

Node* temp = new Node;

malloc(来自C)和new(来自C ++)将分配您需要的内存,但只有new将调用所需的构造函数,因为C不会使用它们。如果您不确定需要malloc,请使用new。

答案 1 :(得分:1)

您不在对象上使用malloc,而应使用newmalloc是一个只分配一块内存的C函数,而C ++运算符std::new也负责对象的初始化和构造 - 你在这里错过了一步,这会导致你的麻烦(对于例如,temp->children的构造函数从未在您的情况下被调用过。)

根据经验:如果您正在编写C ++代码,则应使用C ++运算符std::newstd::delete进行动态内存分配和发布,而不是C函数。

答案 2 :(得分:1)

您的问题是您的children向量未正确初始化。您应该使用Node* temp = new Node;代替malloc来调用Node的构造函数,该构造函数调用children的构造函数,从而正确初始化vector

答案 3 :(得分:1)

正如其他人评论的那样,看起来你来自C并且需要a good C++ book. C ++不只是“C with class es”!

您的push函数看起来非常像应该是构造函数new在分配了所需的内存并执行必要的初始化后调用构造函数。如果你没有提供一个编译器将为你生成一个(它还将提供一个复制构造函数和赋值运算符(参见What is The Rule of Three?)。

由于您调用了malloc()而不是new,因此未调用合成的默认构造函数,因此children vector未初始化,从而导致您的访问冲突。< / p>

在这里,我将演示如何实现默认构造函数(并禁用其他两个),以启动class(或struct)的三个数据成员中的每一个:

#include <string>
#include <vector>
using std::vector;
using std::string;

class Node
{
public:
    Node(const string& word, Node* top)
        :data(word)
        ,parent(top)
        ,children()
    {
        if (top != NULL)
        {
            top->children.push_back(this);
        }
    }

    virtual ~Node()
    {
        std::vector<Node*>::iterator i = std::find(children.begin(), children.end(), this);
        if (i != children.end())
        {
            parent->children.erase(i);
        }
        // TODO: You may wish to destory children at this point
    }

private:
    Node(const Node& disable);
    Node& operator =(const Node& disable);

private:
    string data;
    Node* parent;
    vector<Node*> children;
};

int main()
{
    Node top("blah", NULL);
    Node child("foo", &top);
}

我还实现了一个析构函数,它会在销毁时从其父级子节点中删除一个节点。

答案 4 :(得分:0)

malloc()只是分配一个空的内存块,你应该使用new()操作符初始化所有成员对象;

Node* temp = new Node();