我有两个类:"node"one_answers"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()
{
//???
}
我尝试了很多方法,但基本上我只删除了第一个节点对象。然后我丢失了指向其他节点的指针。。。并泄漏内存,因为我无法再访问它们进行删除。
您可以通过使用std::vector
而不是自己动手链接列表来避免很多问题和工作。除非这是为了学习。
也就是说,做
~poly() /*destructor*/
{
while( start != 0 )
{
node* p_doomed = start;
start = start->next;
delete p_doomed;
}
}
还有很多其他方法可以做到这一点,但上面的模式可以帮助你找出如何做类似的事情。
如果你想保持代码原样,那么你的freePoly
应该是这样的:
while(start)
{
Node *ptr = start;
start = start->getNext();
delete ptr;
}
请注意此代码的作用:首先,它将指针复制到当前头(即第一个Node
),然后使头指向下一个对象,仅,然后为旧头指针调用delete
。
当然,这种设计并不理想:你正在使用C++编译器进行编程,你有一些类和一些成员函数,但你并没有真正有效地使用C++:
语言不仅为您提供了出色的工具,如std::list
或std::vector
,这样您就不必重新发明轮子和std::unique_ptr
,这样指针就可以知道何时可以安全地删除自己。
它还为您提供了强大的抽象概念来对对象的bahavior进行建模。
我建议您退一步,重新思考您的代码。要问的关键问题是:如何在这里写更少的代码?我可以在这里利用C++的哪些功能?我拥有的这些物体是什么?每个物体都做什么?
我知道这可能是一个家庭作业练习,你必须以某种方式实施,但不要让它阻止你学习。
你可以试试这个:
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-destructor:中
~poly(){
delete this->start;
}