删除链接的对象

时间:2014-04-21 16:12:22

标签: c++ class object linked-list

我有两个类:“node”和“poly”。节点对象链接在一起以形成链接列表。 poly对象包含指向第一个节点的指针。我试图为整个“poly”释放内存。我想删除poly - 然后在poly析构函数中调用一个函数(类似“freePoly”),它将帮助我遍历整个节点对象的链表 - 删除所有节点。

这是类定义:

class Node
{
private:
double coeff;
int exponent;
Node *next;
public:

Node(double c, int e, Node *nodeobjectPtr)
{
    coeff = c;
    exponent = e;
    next = nodeobjectPtr;
}

~Node()
{
     printf("Node Destroyed");
      //???
}
class poly
{
private:
Node *start;
public:
poly(Node *head)  /*constructor function*/
{
    start = head;
}
~poly() /*destructor*/
{
       //???
}

void freePoly();
};

void poly::freePoly()
{
 //???
}

我已经尝试了很多东西,但实际上我遇到了只删除第一个节点对象的问题。然后我丢失了指向其他节点的指针......并且因为我无法再访问它们而导致内存泄漏。

3 个答案:

答案 0 :(得分:3)

使用std::vector代替自己动手链接列表,可以避免很多问题和工作。除非这是为了学习。

那说,做

~poly() /*destructor*/
{
    while( start != 0 )
    {
        node* p_doomed = start;
        start = start->next;
        delete p_doomed;
    }
}

还有很多其他方法可以做到这一点,但上面的模式可以帮助你弄清楚如何做类似的事情。

答案 1 :(得分:1)

如果您希望保持代码不变,那么freePoly应如下所示:

while(start)
{
    Node *ptr = start;
    start = start->getNext();
    delete ptr;
}

注意这段代码的作用:首先它复制指向当前头部的指针 - 即第一个Node,然后它指向下一个对象,只有然后头指针调用delete

当然,这个设计并不理想:你使用C ++编译器进行编程,你有一些类和一些成员函数,但你并没有真正地使用 C ++:

语言不仅为您提供了诸如std::liststd::vector等精彩工具,因此您无需重新发明轮子以及std::unique_ptr之类的内容,以便指针知道如果删除自己是安全的。

它还为您提供了强大的抽象概念来模拟对象的行为。

我建议您退后一步,重新考虑您的代码。要问的关键问题是:如何在这里编写更少的代码?我可以在这里利用C ++的哪些功能?我拥有的这些物品是什么以及每个物体的作用是什么?

我知道这可能是一项家庭作业,你必须以某种方式实施,但不要让它阻止你学习。

答案 2 :(得分:0)

你可以试试这个:

private:
   void auxDestroy(Node* p);


void Node::auxDestroy(Node* p){
   if (p!=0) {
      if (p->next != 0) {
         auxDestroy(p->next);
      }
      else {
            delete p;
      }
   }
}

然后在destroy方法中你可以调用这个auxDestroy(this-> next);

~Node(){
    auxDestroy(this->next);
}

在poly析构函数中:

~poly(){
   delete this->start;
}