私はベースポインタに削除を呼び出すとき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バイトを解放しました。
しかし、どうやって知っていますか?新しいオペレータストアサイズ&ポインタを使用して、正しいバイト数を解放することができますか?私は、これは[]の配列のための作品を削除する方法を知っているが、それは事業者new
とnew[]
がために、いくつかのハウスキーピング情報を保存するため
これは実装定義です。意味のある回答を知りたい実装を指定する必要があります。 –
要するに、はい。ヒープ割り当てには、作成された各オブジェクトのサイズとタイプ情報があります。 deleteを呼び出すとルックアップテーブルに移動し、指定されたオブジェクトのそれぞれのバイト数が解放されます。 – callyalater
標準ライブラリの 'operator new'のデフォルトのヒープメモリアロケータは、あなたに渡された各ポインタがどれだけのメモリを所有しているかを知っています。ランタイム後の原因のクリーンアップを担当するものが、適切なデストラクタを正しく呼び出しました。 – WhiZTiM