1

クラスのデストラクタではなく、ポインタに対して「delete []」を呼び出す必要があるかどうかを定義するにはどうすればよいですか? ポインター (メンバー変数) は、ヒープに割り当てられているか、別の時間に割り当てられていないバッファーを指すことができます (読み取り専用メモリ内のリテラルまたはスタックに配置されたリテラルである可能性があります)。それを解決する最善の方法は何ですか?別のフラグを使用する必要がありますか、それともヒープ境界のアドレスを取得して、それらの間のバッファアドレスを確認する必要がありますか? それとももっと合理的な方法がありますか?

4

2 に答える 2

2
  1. 動的に割り当てられたメンバーを使用しない (動的に割り当てられたデータ メンバーの代わりに、またはその代わりに使用するstd::stringchar *std::vector) または
  2. スマート ポインターを使用する
于 2013-04-30T15:09:11.400 に答える
2

ポインターを見ただけでは、ポインターが自動ストアにあるか、静的メモリにあるか、動的メモリにあるかを判断することはできません。そのポインターを設定するときにフラグを保存する必要があります-たとえば、次のようにします。

class classWithDynamicData {
private:
    bool needToDelete;
    char strData[];
public:
    classWithDynamicData(int size) : needToDelete(true), strData(new char[size]) {
    }
    classWithDynamicData(char* data) : needToDelete(false), strData(data) {
    }
    ~classWithDynamicData() {
        if (needToDelete) delete[] strData;
    }
    ...
    // You need to define a copy constructor and an assignment operator
    // to avoid violating the rule of three
};
于 2013-04-30T15:09:21.137 に答える