2016-07-14 10 views
0

デストラクタが以下のコードでどのように呼び出されるかについて簡単に質問します。私は~LinkedList()デストラクタを呼び出してカスタムclear()動的メモリを解放する関数を持っています。LinkedListの内容を削除する(デストラクタ)

LinkedList ll_oneを削除したい場合は、どうすればよいですか(下記のsource.cpp)?以下の出力のようなもの:リンクされたリストのいずれかを出力する

...

リンクリスト1 {19、18、17、16、15}

デストラクタがリンクリストを出力する

と呼ば1 ...

リンクリスト1 {}


//Node.h 
#ifndef NODE 
#define NODE 
struct Node { 
    int value; 
    Node* next; 

    Node(int i) : value(i), next(nullptr) {} 
    Node() : value(0), next(nullptr) {} 
}; 
#endif /*NODE*/ 

//LinkedList.h 
#ifndef LINKEDLIST 
#define LINKEDLIST 
#include <ostream> 
#include "Node.h" 

class LinkedList { 
    Node* head; 
    Node* tail; 
    std::string name; 

    void recursePrint(Node*, std::ostream&) const; 

public: 
    LinkedList(); 
    LinkedList(std::string); 
    // destrcutor declaration 
    ~LinkedList(); 
    void setName(std::string); 
    std::string getName() const; 

    void insertFront(int); 
    void insertBack(int); 
    void clear(); 
    void print() const; 
    void print(std::ostream&) const; 
    void printReverse() const; 
    void printReverse(std::ostream&) const; 

    friend std::ostream& operator<<(std::ostream&, const LinkedList&); 

}; 
#endif /*LINKEDLIST*/ 

//LinkedList.cpp 
#include <iostream> 
#include <string> 
#include "LinkedList.h" 
using namespace std; 

LinkedList::LinkedList() : head(nullptr), tail(nullptr) {} 
LinkedList::LinkedList(string name) : 
    head(nullptr), tail(nullptr), name(name) {} 

// Define destructor 
LinkedList::~LinkedList() { 
    cout << "caling destructor" << endl; 
    clear(); 
} 

void LinkedList::setName(string name) { 
    this->name = name; 
} 

string LinkedList::getName() const{ 
    return name; 
} 

void LinkedList::insertFront(int value) { 
    Node* newNode = new Node(value); 
    newNode->next = head; // attach to list 
    head = newNode; 
    if (tail == nullptr) { // empty list 
     tail = newNode; // only node is both head and tail 
    } 
} 

void LinkedList::insertBack(int value) { 
    Node* newNode = new Node(value); 
    if (tail != nullptr) 
     tail->next = newNode; // attach to list 
    tail = newNode; 
    if (head == nullptr) { // empty list 
     head = newNode; // only node is both head and tail 
    } 
} 

// Define 
void LinkedList::clear() { 
    Node* temp; 
    while (head != NULL) { 
     temp = head->next; 
     delete head; 
     head = temp; 
    } 
    head = tail = NULL; 


} 

void LinkedList::print() const { 
    print(cout); 
} 

void LinkedList::print(ostream& os) const { 
    os << this; 
} 

void LinkedList::printReverse() const { 
    printReverse(cout); 
} 

void LinkedList::printReverse(ostream& os) const { 
    os << this->name << ": "; 
    Node* current = this->head; 
    if (current == nullptr) { 
     os << "<Empty List>"; 
    } 
    else 
     recursePrint(current, os); 
    os << endl; 
} 

void LinkedList::recursePrint(Node* node, ostream& os) const { 
    if (node != nullptr) { 
     recursePrint(node->next, os); 
     os << node->value << " "; 
    } 
} 

ostream& operator<<(ostream& os, const LinkedList& ll) { 
    os << ll.getName() << " {"; 
    Node* current = ll.head; 
    if (current == nullptr) { 
     os << " <Empty List>"; 
    } 
    while (current != nullptr) { 
     if (current != ll.head) 
      cout << ","; 
     cout << " " << current->value; 
     current = current->next; 
    } 
    cout << " }"; 
    return os; 
} 

//Source.cpp 
#include <iostream> 
#include "LinkedList.h" 
using namespace std; 

int main() { 
    LinkedList ll_one("Linked List one"); 
    int num = 0; 
    for (unsigned int i = 15; i < 20; ++i) { 
     ll_one.insertFront(i); 
    } 
    cout << "Outputting Linked List one..." << endl; 
    cout << ll_one << endl; 

    // How to delete the ll_one? 
    cout << "Outputting Linked List one..." << endl; 
    cout << ll_one << endl; 

    system("pause"); 
} 
+0

'll_one.clear(); – Drop

+0

デストラクタも'} '非常に最後の(範囲の終わり)に呼び出される' – Drop

+0

与えられたあなたにコードでは、 'll_one'は自動的に呼び出されるデストラクタを持ちます。あなたのデストラクタが正しいことをしている限り、あなたは完了です。明示的に削除する必要はありません。それがデストラクタの目的です。 – GManNickG

答えて

0

ll_oneはスタック上に作成されます。そのオブジェクトがメインのスコープを離れると自動的にポップされ、そのデストラクタが呼び出されます。ヒープに割り当てる場合は、手動でdeleteを呼び出さなければなりません。

ここでは、ヒープに割り当てられている例を示します。

LinkedList* ll_one = new LinkedList(); 
delete ll_one; 

リストを空にするか、削除前に使用していたスペースを解放する場合は、クリアを呼び出します。

ヒープ

LinkedList* ll_one = new LinkedList(); 
ll_one->clear(); 
delete ll_one; 

スタック

LinkedList ll_one; 
ll_one.clear(); 
+0

答えに感謝します。しかし、私はそれが範囲の外に行く前にデストラクタからのcoutを表示する方法は、メインの範囲内にある場合は、私は疑問に思っていますか?私は現在の構造を変更せずにこれを行うことができるかどうかを確認しようとしています。 – OpenMaze

関連する問題