2014-04-21 46 views
0

我有两个类:“节点”和“聚”。节点对象链接在一起形成一个链表。多对象包含一个指向第一个节点的指针。我试图为整个“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() 
{ 
//??? 
} 

我已经尝试了很多东西,但本质上我会被卡住在那里我只是删除第一个节点对象。然后我失去了指向其他节点的指针......并泄漏内存,因为我无法再访问它们以进行删除。

+2

你不是在这里问这个? http://stackoverflow.com/questions/23200451/using-the-destructor-to-free-linked-objects – PaulMcKenzie

回答

3

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

这就是说,做

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

也有许多其他方法可以做到这一点,但上面的一种模式,可以帮助你找出如何做类似的事情。

1

如果你要保持你的代码是,那么你的freePoly应该是这样的:

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

注意这个代码的功能:首先,它使指向当前头的副本 - 即首先Node,然后它使头指向下一个对象,并且只有然后调用delete旧的头指针。

当然,这样的设计并不理想:您使用的是C++编译器编程,你有一些类和一些成员函数,但你是不是真的使用 c + +有效:

不仅语言为您提供精彩的工具,如std::liststd::vector,这样您就不必重新发明轮子和诸如std::unique_ptr之类的东西,以便指针知道何时可以安全地删除自己。

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

我建议你退后一步,重新考虑你的代码。要问的关键问题是:如何在此处编写更少的代码?我可以在这里使用哪些C++设施?我拥有的这些物体是什么,每个物体都做了什么?

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

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(这个 - >未来);

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

而且在析构聚:

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