C ++中的动态内存和继承结构

时间:2010-02-18 21:50:17

标签: c++ inheritance dynamic-memory-allocation new-operator

说我有这样的结构:

struct A{
 int someInt;
}

struct B : public A{
 int someInt;
 int someOtherInt;
}

一堂课:

class C{
 A *someAs;
 void myFunc(A *someMoreAs){
  delete [] someMoreAs;
 }
}

这会导致问题:

B *b=new B[10];
C c;
c.myFunc(b);

因为它正在删除b,认为它是A类型,它更小。这会导致内存泄漏吗?

另外,假设我想在myFunc中分配更多与b相同的内容,使用new,但没有C知道b是A还是B?一个朋友sugegsted typeof,但VC似乎不支持这个。

1 个答案:

答案 0 :(得分:4)

在这种特殊情况下,没有内存泄漏,因为A和B都是POD(普通旧数据),因此它们的内容不需要任何破坏。

但是,在一个应该继承的(基础)类中总是有一个虚拟析构函数是一个好习惯。如果向A添加虚拟析构函数,则通过A*进行的任何删除都将调用正确的派生析构函数(包括破坏派生类的成员)。

virtual ~A() {}

但请注意,您不能在基类型数组中使用继承,正是因为对象的实际大小可能不同。

你真正想要的可能是一个指向基类的指针数组:

std::vector<A*> someAs;

或者Boost等价物(具有自动内存管理和更好的API):

boost::ptr_vector<A> someAs;