delete如何从基指针知道派生类的大小?

时间:2017-02-16 20:34:36

标签: c++

我很好奇删除操作符在基类指针上调用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());
 }
};
  




测试:




 <代码> 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个字节。

&#xA;&#xA;

但它是怎么知道的?新的运营商是否存储尺寸&amp;删除操作符然后可以使用哪个指针来释放正确的字节数?我知道这就是delete []如何适用于数组但是当涉及到派生类时我无法找到任何信息

&#xA;

1 个答案:

答案 0 :(得分:8)

deletedelete[]运营商知道分配的大小,因为运营商newnew[]在分配时为他们保存了一些内务信息。当malloc保存free执行其工作所需的大小信息时,它使用与malloc / free对相同的构思。

确定分配大小与分配内存的类型无关。运算符deletedelete[]甚至不知道要删除的指针的类型,因为它们在void指针上运行。

相关问题