brt*_*rtb 1 c++ memory-leaks memory-management
我有一个名为Animal的类,它有一个虚拟的方法,所以类成为虚拟类.
class Animal
{
virtual double eat() = 0;
};
Run Code Online (Sandbox Code Playgroud)
我还有两个他们是猫和狗的课程,这些课程继承自动物.
并且有第四类-zoo-并且它有一个字段
vector<Animal *> animals;
Run Code Online (Sandbox Code Playgroud)
我正在将猫狗实例推向动物园对象的动物矢量.
在任何时候我想清除动物园实例,我也希望删除此对象的向量.我也希望删除此对象的矢量对象.
我究竟应该怎么做.除了动物园之外的所有类都只有浮点字段(没有指针).(浮动a,b等)所以我们可以说没有必要处理动物物体,因为它们没有任何指针.
我应该在哪里写析构函数.在基类(动物)或子类(猫 - 狗)或无处或我应该如何编写这些析构函数.
首先,您需要声明Animal
一个虚拟析构函数:
class Animal
{
virtual double eat() = 0;
public:
virtual ~Animal() {}
};
Run Code Online (Sandbox Code Playgroud)
这是必需的,使得调用delete
上的Animal
指针将调用对象的类型的析构函数的指针指向.在没有虚拟析构函数的情况下执行此操作会导致未定义的行为.
接下来,您需要调用delete
所有动态分配的Animals
:
for (auto a : animals)
delete a;
Run Code Online (Sandbox Code Playgroud)
然后,您可以清除矢量:
animals.clear();
Run Code Online (Sandbox Code Playgroud)
如果您需要使用animals
其他内容,则需要这样做.您不需要在zoo
析构函数中执行此操作.
或者,您可以使用std::vector<std::unique_ptr<Animal>>
并忘记手动内存管理.