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上でDevC++を実行しています。それでの私の望みは、私のOSでのメモリリークを防ぐことでした。あれは正しいですか?

ありがとう

-トリングヴ

4

2 に答える 2

5
delete delptr;

それは確かに間違っていdelptr == thisます。なぜなら、最初はデストラクタにいるからです(つまり、割り当て解除要求ですでに呼び出されているコード)

于 2012-11-18T00:34:50.310 に答える
1

リソース管理を作成する際の重要なアイデアは、概念と責任を可能な限り単純に保つことです。

あなたが持っているのは、そのすべての子を削除する責任があるルートノードです。個々のノードよりも、削除を担当する構造を非常に好むでしょう。

一般的に行うことは、NodeクラスとともにLinkedListタイプ/クラスを作成することです。これにより、責任が簡素化されます。LinkedListタイプはノードを所有し、所有者としてそのデストラクタでの削除を担当します。

次に、inserts and remove / removeDupsは、LinkedListクラスに入ります。ノードは次のような機能を支援できます

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