2010-02-18 64 views
3

说我有一些结构是这样的:动态内存和C派生结构++

struct A{ 
int someInt; 
} 

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

和A类:

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

会这样导致一个问题:

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

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

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

+0

VC不太多支持的typeof ()。你使用的是什么版本,代码如何失败? (请注意,你不需要在你的情况下使用它...) – Macke 2010-02-18 21:59:01

+0

我不想尝试从myFunc(),btw ...;)索引该数组, – Macke 2010-02-18 21:59:51

回答

4

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

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

virtual ~A() {} 

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

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

std::vector<A*> someAs; 

还是升压当量(带有自动内存管理和更好的API):

boost::ptr_vector<A> someAs;