1

我正在研究一个链接列表类。每当我编译时,我都没有收到任何错误或警告。但是,可执行文件停止工作(使用 Windows Dev C++)。我推断问题出在我的析构函数上。

我的理解是使用 delete 关键字为动态创建的对象调用析构函数,或者每当对象超出堆栈上对象的范围时。

我认为当我的堆栈对象(Node* 结果)调用析构函数时会出现我的问题,但不确定。

这是我的头文件:

    #ifndef Node_H
    #define Node_H

    class Node{
          int data;
          Node* next;

    public:
           Node(int data);       
           ~Node();
           void insert(int d);
           Node* remove(int d);
           void removeDups(void);
           Node* add(Node* a, Node* b);
           void printOut(void);
    };

    #endif

.cpp 文件的相关部分:

    #include <iostream>
    #include "Node.h"

    using namespace std;

    Node::Node(int d){
          data = d;
          next = NULL;
          }

    Node::~Node(){
           Node* n = this;
           Node* delptr;

           while(n->next != NULL){
                         delptr = n;
                         n = n->next;
                         delete delptr;
                         }
           delete n;            

        }

    void Node::insert(int d){

          Node* n = this;
          Node* current = new Node(d);

          while(n->next != NULL){
                  n = n->next;                   
                  }

          n->next = current;
          }

主要的:

    int main (void){
        int i = 0;

        Node* root = new Node(111);
        Node* result;

        root->printOut();

        for (i = 0; i < 11; i++){
            root->insert(i);
            } 

        root->printOut();

        delete root; 
        getchar();
        return 0;   
    }

另外,我在 USB 上运行 Dev C++。我的希望是防止我的操作系统出现内存泄漏。那是对的吗?

谢谢

——特灵武

4

2 回答 2

5
delete delptr;

这肯定是错误的,因为最初delptr == this,并且您处于析构函数中(即已在释放请求上调用的代码)

于 2012-11-18T00:34:50.310 回答
1

编写资源管理的关键思想是使概念和职责尽可能简单。

您拥有的是一个根节点,负责删除其所有子节点。您更喜欢负责删除的结构,而不是单个节点。

常见的做法是创建一个 LinkedList 类型/类以及一个 Node 类。这将简化职责。LinkedList 类型将拥有节点,并作为所有者负责在其析构函数中删除。

然后 inserts 和 remove / removeDups 将进入 LinkedList 类。该节点可以帮助执行以下功能

insert(Node* afterThisNode){  
    this->next = afterThisNode->next;
    afterThisNode->next= this;
}
于 2012-11-18T00:47:10.640 回答