说我有这样的结构:
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似乎不支持这个。
答案 0 :(得分:4)
在这种特殊情况下,没有内存泄漏,因为A和B都是POD(普通旧数据),因此它们的内容不需要任何破坏。
但是,在一个应该继承的(基础)类中总是有一个虚拟析构函数是一个好习惯。如果向A
添加虚拟析构函数,则通过A*
进行的任何删除都将调用正确的派生析构函数(包括破坏派生类的成员)。
virtual ~A() {}
但请注意,您不能在基类型数组中使用继承,正是因为对象的实际大小可能不同。
你真正想要的可能是一个指向基类的指针数组:
std::vector<A*> someAs;
或者Boost等价物(具有自动内存管理和更好的API):
boost::ptr_vector<A> someAs;