如何为相同类型的对象正确分配内存

时间:2015-12-05 18:51:41

标签: c++ arrays oop pointers memory-management

我有这个类,它在创建链表时很像节点。

class Element {
public:
    int id;
    int value;
    bool parent;
    bool is_ministry;
    int children_count;
    int children_in;
    Element **children; //CHILDREN ARRAY
    Element* next; //TO NOT LOSE ELEMENTS
    Element(int _id,int _value,int _children_count=0,bool _is_ministry=false){
        this->id=_id;
        this->value=_value;
        this->is_ministry=_is_ministry;
        this->children_in=0;
        if(_children_count>0)
            this->parent=true;
        else this->parent=false;
            this->children_count=_children_count;
        this->next=NULL;
        if(_children_count>0){
            this->children = new Element*[_children_count];
        }
        else this->children=NULL;
    }
    ~Element(){
        ///delete children;
    }
};

我需要这个对象有一个指向同一类型对象的指针数组,数组大小因给定输入而异--child_count。 它可以静态创建吗?值从文件中读取。我选择了动态方法,但我不确定它是否正确完成,因为它可以工作,但是在我添加3个对象之后,整个事情都会烧毁。所以我正在寻找合理的错误。 我正在制作像树一样的东西。其中一个元素可以直接访问同一类型对象的一个​​级别。 编辑:更多代码

    void chain_together(Element *_parent, Element *_child){
///CHILDREN_IN is and int which shows currently how much elements are in the array.
            if(_parent->children_in>0){
                for(int i=0;i<_parent->children_in;i++) ///CHEKING IF THERE ALREADY IS A LINK BETWEEN THEM
                    if(_parent->children[i]->id != _child->id){
                        _parent->children[_parent->children_in] = _child;
                        _parent->children_in++;
                    }
            }else{
                        _parent->children[_parent->children_in] = _child;
                        _parent->children_in++;
            }

        }

1 个答案:

答案 0 :(得分:0)

让我们来看看chain_together方法。

if(_parent->children_in>0){

如果子列表不为空

    for(int i=0;i<_parent->children_in;i++) 

访问所有已知的孩子

        if(_parent->children[i]->id != _child->id){

如果这个孩子不是我们想要添加的孩子,请添加孩子

                    _parent->children[_parent->children_in] = _child;
                    _parent->children_in++;
         }
}else{

没有孩子。添加第一个孩子

    _parent->children[_parent->children_in] = _child;
    _parent->children_in++;
}

通过增加几个孩子来看看会发生什么......

On the first child 
    just add them.

On the second child, 
    they are not the first child
        add them

On the third child, 
    they are not the first child
        add them. 
    they are not the second child
        add them.

看到问题?如果不是......

On the fourth child, 
    they are not the first child 
        add them. 
    they are not the second child
        add them. 
    they are not the third child
        add them. 
    they are not the third child
        add them.

通过使用调试器逐步执行代码,可以轻松检测到此错误。调试器带有值得使用的编译器工具包。它可能是您学习用作程序员的最重要的工具。

解决方案:

在添加新孩子之前,测试添加的孩子与所有预先存在的孩子不匹配。