首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++ delete 派生类?该怎么处理

2013-09-06 
c++ delete 派生类?基类:class A{private:int a}派生类class B : public A{private:int b}int main(){

c++ delete 派生类?
基类:
class A
{
   private:
       int a;
};
派生类
class B : public A
{
   private:
       int b;
};

int main()
{
   A *p = new B;
   delete p;
   return 0;
}

求解 delete p 时程序释放内存的过程?



[解决办法]
编译器先调用合成的B的析构函数,再调用A的析构函数了。
[解决办法]

引用:
Quote: 引用:

从内存的角度来说,c++ delete 使用malloc语意,也就是他不管对象大小,这个由分配器解决。分配器在指针前后有上下文来释放内存。

所以内存是否的问题不属于c++范畴。

这个过程应该是这样的:

p->~B();
free(p);

如果A的析构是虚析构,就会倒序调用前面的虚函数。由于你的demo,是标准的pod布局。优化后的结果应该只是:
free(p);

请问大神 p->~B() 这一步是怎么来的?


#include <new>
struct foo {
};

foo *create() {
  void *p = malloc(sizeof(foo));
  new (p) foo;
  return (foo*)p;
}

void destroy(foo *p) {
   p->~foo();
   free(p);
};

这就是分配和释放的过程。而且应该可以编译通过。如果foo有父类,且虚析构,由于虚构的特殊性,在foo的析构结束的时候,会自动调用父类的析构,这是跟普通虚函数不同的地方。

这段代码应该是所有为了避免传统委托式内存分配的基础,基本上都大同小异。

热点排行