0

こんにちは、valgrind を使用してプログラムを実行しました。これがレポートです

ヒープの概要: 終了時に使用中: 1 ブロックで 8 バイト 合計ヒープ使用量: 1 割り当て、0 解放、8 バイト割り当て リークの概要: 確実に失われました: 1 ブロックで 8 バイト

これは私のプログラムです

int main() {    
NodeData nodedata1(1, 'a');
List list1;
list1.insert(&nodedata1);

   return 0;
}
//---my List class
class List {
public:
   List(); 
   bool insert(NodeData*);                     // insert one Node into list
   bool isEmpty() const; 
private:
   struct Node {              // the node in a linked list
      NodeData* data;         // pointer to actual data, operations in NodeData
      Node* next;
   };
   Node* head;                                 // pointer to first node in list
};
// my bool insert method
bool List::insert(NodeData* rightPtr) {  
   Node* newPtr = new Node;
   newPtr->data = rightPtr;    
   if (isEmpty() || *newPtr->data < *head->data) {
      newPtr->next = head;                           
      head = newPtr;
   }
   else {
      Node* current = head; 
      while (current->next !=NULL && *current->next->data < *newPtr->data) {
           current = current->next;
      }
      newPtr->next = current->next;
      current->next = newPtr;
   }
   return true;
}
4

2 に答える 2

4

宣言によって作成されたオブジェクトは、そのスコープが終了する前に破棄されます。newを使用して作成されたオブジェクトは、手動で削除しない限り破棄されません。次の例は、オブジェクトの有効期間を示しています。

#include <iostream>
using namespace std;

class Data {
    protected:
        char* name;
    public:
        Data(char* n) {
            name = n;
            cout << name <<  " is created." << endl;
        }

        ~Data() {
            cout << name <<  " is destroyed." << endl;
        }
};

void ScopeDemo() {
    Data obj1("Obj1");
    Data* obj2 = new Data("Obj2");
}

int main()
{
    ScopeDemo();
    return 0;
}

最新のオペレーティング システムでは、アプリケーションが使用するメモリは、アプリケーションの終了時に解放されます。


あなたの例では、Listオブジェクトが(オブジェクトデストラクタを介して)破棄されたとき、およびListからノードを削除したときに、手動で削除する必要があります。

List::~List() {
    if (!isEmpty()) {
        Node* toDelete = head;
        while(toDelete != NULL) {
            Node* next = toDelete->next;
            delete toDelete;
            toDelete = next;
        }
    }
}
于 2012-04-14T09:07:19.183 に答える
3

Nodeメソッドに aを動的に割り当て、insert削除することはありません。

Node* newPtr = new Node;

これらを追跡してデストラクタでNodes削除するか、メモリを処理するための他の手配を行う必要があります (つまり、適切なタイミングでそれらを削除する担当者に の所有権を渡します)。ListNodes

于 2012-04-14T08:26:18.997 に答える