我很好奇删除操作符在基类指针上调用delete时如何知道派生类的大小,这是一个最小的例子:


 class IVariant& #xA; {
市民:
 virtual~IVariant()= default;
 virtual void print_value()= 0;
};

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

 template<&gt ;
类Variant< int&gt ;: public IVariant
 {
 private:
 int m_integer;

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

模板<>
类Variant< double&gt ;: public IVariant
 {
 private:
 double m_dbl;

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

模板<>
类Variant< std :: string&gt ;: 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());
 }
};
 代码>


 测试:
&#XA;&#XA;<代码> int main()&#xA; {&#xA; IVariant * int_var = new Variant&lt; int&gt;(100);&#xA; IVariant * dbl_var = new Variant&lt; double&gt;(100.0f);&#xA; IVariant * str_var = new Variant&lt; std :: string&gt;(“值为100 \ n”);&#xA;&#xA; int_var-&GT; print_value();&#XA; dbl_var-&GT; print_value();&#XA; str_var-&GT; print_value();&#XA;&#XA; delete int_var;&#xA;删除dbl_var;&#xA;删除str_var;&#xA;}&#xA;&#xA;&#xA;
删除操作符只能从基本指针中正确地知道 int_var = variant&lt; int&gt ;
所以释放了4个字节, dbl_var = variant&lt; double&gt;
所以释放了8个字节, str_var = variant&lt; std :: string&gt;
所以它释放了28个字节。
但它是怎么知道的?新的运营商是否存储尺寸&amp;删除操作符然后可以使用哪个指针来释放正确的字节数?我知道这就是delete []如何适用于数组但是当涉及到派生类时我无法找到任何信息
&#xA;答案 0 :(得分:8)
delete
和delete[]
运营商知道分配的大小,因为运营商new
和new[]
在分配时为他们保存了一些内务信息。当malloc
保存free
执行其工作所需的大小信息时,它使用与malloc
/ free
对相同的构思。
确定分配大小与分配内存的类型无关。运算符delete
和delete[]
甚至不知道要删除的指针的类型,因为它们在void
指针上运行。