gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:08:52 26 4
gpt4 key购买 nike

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

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? friend 推荐了typeof,VC好像不支持。

最佳答案

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

不过,在应该继承的(基)类中始终拥有一个虚拟析构函数是一个好习惯。如果您向 A 添加虚拟析构函数,则通过 A* 进行的任何删除操作也会调用适当的派生析构函数(包括派生类成员的析构)。

virtual ~A() {}

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

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

std::vector<A*> someAs;

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

boost::ptr_vector<A> someAs;

关于c++ - C++ 中的动态内存和继承结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com