3

假设我有一些这样的结构:

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?有朋友建议typeof,但是VC好像不支持这个。

4

1 回答 1

4

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

尽管如此,在应该继承的(基)类中始终有一个虚拟析构函数是一个好习惯。如果向 中添加虚拟析构函数A,则任何删除 viaA*也将调用正确的派生析构函数(包括销毁派生类的成员)。

virtual ~A() {}

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

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

std::vector<A*> someAs;

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

boost::ptr_vector<A> someAs;
于 2010-02-18T21:52:12.290 回答