2017-02-16 7 views
2

私はベースポインタに削除を呼び出すときdelete演算子は、ここに最小限の一例であり、派生クラスのサイズを知っているか興味があります:deleteは、ベースポインタから派生クラスのサイズをどのように知っていますか?

class IVariant 
{ 
public: 
    virtual ~IVariant() = default; 
    virtual void print_value() = 0; 
}; 

template<typename T> 
class Variant: public IVariant {}; 

template<> 
class Variant<int>: public IVariant 
{ 
private: 
    int m_integer; 

public: 
    Variant(int integer): m_integer(integer) {} 
    void print_value() override 
    { 
     printf("integer: %i\n", m_integer); 
    } 
}; 

template<> 
class Variant<double>: public IVariant 
{ 
private: 
    double m_dbl; 

public: 
    Variant(double val): m_dbl(val) {} 
    void print_value() override 
    { 
     printf("double: %g\n", m_dbl); 
    } 
}; 

template<> 
class Variant<std::string>: public IVariant 
{ 
private: 
    std::string m_string; 

public: 
    Variant(const std::string& string): m_string(string) {} 
    void print_value() override 
    { 
     printf("string: %s\n", m_string.c_str()); 
    } 
}; 

テスト:

int main() 
{ 
    IVariant* int_var = new Variant<int>(100); 
    IVariant* dbl_var = new Variant<double>(100.0f); 
    IVariant* str_var = new Variant<std::string>("the value is 100\n"); 

    int_var->print_value(); 
    dbl_var->print_value(); 
    str_var->print_value(); 

    delete int_var; 
    delete dbl_var; 
    delete str_var; 
} 

delete演算子を正しく知っていましたint_var = variant<int>このように解放された4バイト、dbl_var = variant<double>は8バイトを解放して、str_var = variant<std::string>を解放し、28バイトを解放しました。

しかし、どうやって知っていますか?新しいオペレータストアサイズ&ポインタを使用して、正しいバイト数を解放することができますか?私は、これは[]の配列のための作品を削除する方法を知っているが、それは事業者newnew[]がために、いくつかのハウスキーピング情報を保存するため

+0

これは実装定義です。意味のある回答を知りたい実装を指定する必要があります。 –

+0

要するに、はい。ヒープ割り当てには、作成された各オブジェクトのサイズとタイプ情報があります。 deleteを呼び出すとルックアップテーブルに移動し、指定されたオブジェクトのそれぞれのバイト数が解放されます。 – callyalater

+2

標準ライブラリの 'operator new'のデフォルトのヒープメモリアロケータは、あなたに渡された各ポインタがどれだけのメモリを所有しているかを知っています。ランタイム後の原因のクリーンアップを担当するものが、適切なデストラクタを正しく呼び出しました。 – WhiZTiM

答えて

8

deletedelete[]事業者は、割り当てのサイズを知っている派生クラスに来たとき、私はすべての情報を見つけることができませんでした配分の時にそれらを。 malloc/freeペアと同じ考えを使用します。mallocは、freeがジョブを実行するために必要なサイズ情報を保存するときに使用します。

割り当てサイズの特定は、メモリが割り当てられているタイプとは関係ありません。演算子deletedelete[]は、ポインタがvoidポインタ上で動作するため、削除されるポインタの型さえ知らない。

+0

は私の疑いをなくした、ありがとう。 – Budskii

関連する問題