2

デストラクタは本質的に、メモリの割り当てを解除するか、使い終わったときに「クリーンアップ」を行う関数であることを知っています。

私の質問は、適切なデストラクタには何が入るのですか?

私が持っているクラスのコードをいくつか紹介しましょう。

#ifndef TRUCK_H__
#define TRUCK_H__

#include <iostream>
#include "printer.h"
#include "nameserver.h"
#include "bottlingplant.h"

using namespace std;

class BottlingPlant; // forward declaration

class Truck {

    public:
    Truck( Printer &prt, 
           NameServer &nameServer, 
           BottlingPlant &plant, 
           unsigned int numVendingMachines, 
           unsigned int maxStockPerFlavour );
    ~Truck();
    void action();

    private:
    Printer* printer;       // stores printer
    NameServer* ns;         // stores nameserver
    BottlingPlant* bottlingPlant;   // stores bottlingplant
    unsigned int numVM;     // stores number of vendingmachine
    unsigned int maxStock;      // stores maxStock
    unsigned int cargo[4];      // stores the cargo.

};

コンストラクタは次のとおりです。

Truck::Truck( Printer &prt, 
              NameServer &nameServer, 
              BottlingPlant &plant, 
              unsigned int numVendingMachines, 
              unsigned int maxStockPerFlavour ) {
    printer = &prt;
    printer->print( Printer::Truck, 'S' ); 
    ns = &nameServer;
    bottlingPlant = &plant;
    numVM = numVendingMachines;
    maxStock = maxStockPerFlavour;
    cargo[ 0 ] = 0;
    cargo[ 1 ] = 0;
    cargo[ 2 ] = 0;
    cargo[ 3 ] = 0;
}//constructor

私のデストラクタ クラスでは、ポインタの後にクリーンアップする必要がありますか? つまり、それらを NULL に設定しますか? またはそれらを削除しますか?

すなわち

Truck::~Truck()
{
    printer = NULL; // or should this be delete printer?
    ns = NULL;
    bottlingPlant = NULL;
    // anything else? or is it fine to leave the pointers the way they are?
}//destructor

適切なデストラクタを作成する良い習慣を身につけたいだけです。

4

2 に答える 2

6

オブジェクトにポインターを格納するときは、ポインターが指すメモリの所有者を明確に理解する必要があります。クラスが所有者である場合、デストラクタはメモリの割り当てを解除する必要があります。そうしないと、リークが発生します。クラスが所有者でない場合は、メモリの割り当てを解除してはなりません。

ポイントを NULL に設定する必要はありません。重要なことは、メモリ自体を適切に処理することです。

ポインターを管理するより簡単な方法は、これを自動的に処理するスマート ポインター クラスを使用することです。

于 2012-07-26T01:18:34.613 に答える
2

ポインターはクラス内から割り当てられていないため、delete も NULL もここにはありません。ポインタはクラスの外から渡されるので、そのままにしておきます。

実際、参照を渡してから、コンストラクター内でそれらをポインターに変換しています。それは必要ないようです。社内で参考にした方がいいかもしれません。本当にユースケースに依存します。ポインターを使用したい場合は、代わりにコンストラクターにポインターを受け入れさせることをお勧めします。明示的は暗黙的よりも優れています。

于 2012-07-26T01:24:41.520 に答える