-2

片道リストプログラムを作りました。

デストラクタまたはデフォルトのデストラクタが正常に機能する必要があるかどうかを知りたいですか?

class sll
{
    node*head;
    node*tail;
public:
    sll()
    {
        head=tail=0;
    }
    sll(const sll & obj1);
    void addtohead (int x);
    void addtotail (int x);
    int deletefromhead();
    int deletefromtail();
}
4

2 に答える 2

6

sll() コンストラクターはオブジェクトの intilization 時に head と tail のみを 0 に初期化するため、デフォルトのデストラクタは head と tail のメモリのみを解放します。

動的に割り当てられたノードでは機能しません。クラスに次のコードを実装します。

~sll()
{
    node *p = head;
    while (head !=NULL)
    {
        head= head -> next;
        delete p;
        p=head;
    }
}
于 2013-11-05T07:42:50.757 に答える
5

RAII または適切なコードを開発しようとしている場合を除き、デストラクタは必須ではありません。

デストラクタを含めない場合、クラスを使用する人々に負担がかかります。デストラクタがないこと、およびノー​​ドをスコープ外に出すか破棄する前にノードを削除する必要があることを認識する必要があります .

「ifstream」クラスを考えてみましょう。

void function(const char* filename) {
    if (!haveReadFile) {
        ifstream file(filename); // create 'file' and open filename.
        if (file.good()) {      // file opened.
            readFile(file);
            haveReadFile = true;
        }
    }
    // .. other stuff.
}

ここでは、「file.close()」を実行したり、その他のクリーンアップを実行したりする必要はありませんでした。それはすべて、istream との契約にカプセル化されていました。オブジェクトが消えたとき、それは正しいことをしました。

同様に "std::string" の場合 -- する必要はありません

std::string greeting = "Hello, ";
greeting += username;
std::cout << greeting << std::endl;
greeting.freeMemory();

文字列にはデストラクタがあるため、契約ではそのリソースを積極的に管理する必要はありません。

では、デストラクタが必須かどうかは気にしないでください。クラスがスコープ外になったときに発生する動作は、デストラクタがない場合に意味がありますか? メモリリークは発生しますか?

于 2013-11-05T07:54:05.527 に答える