gpt4 book ai didi

c++ - 这是抽象的但具有非虚拟析构函数删除导致错误。这是为什么?

转载 作者:行者123 更新时间:2023-12-05 03:38:06 25 4
gpt4 key购买 nike

using namespace std;

class Animal{
public:
virtual void cry() = 0;
void eat();
};


class Cat:public Animal
{
public:
virtual void cry();
void grooming();
};


class Dog:public Animal
{
public:
virtual void cry();
void lash();
};


main()
{
Animal* animal = new Cat();
animal->eat();
animal->cry();

Cat* cat = (Cat*)animal;
cat->grooming();

Dog* dog = new Dog();
dog->cry();
dog->eat();
dog->lash();

delete animal; //Delete called on'animal' that is abstract but has non-virtual destruct
delete cat; //Thread 1: signal SIGABRT
delete dog;
}

删除导致错误。这是为什么?尝试不使用析构函数通过delete释放内存,但出现错误“删除抽象但具有非虚拟破坏的'动物'线程 1:信号 SIGABRT"

最佳答案

错误告诉您问题是什么。您正在使用非虚拟析构函数销毁虚拟对象。

你有virtual void cry 为什么?这样一来,当您调用 animal->cry 时,它会调用 Cat 的哭声,而不是默认的 Animal 的哭声。虚析构函数也是如此。当您调用 delete animal 时,您需要它调用实际对象的析构函数,而不仅仅是基类。您需要添加:

virtual ~Animal() = default;

给你的动物类。

A base class destructor should be either public and virtual, or protected and non-virtual

Cpp Core Guidelines

关于第二个问题,双删:

delete animal; // deletes the object
delete cat; // deletes the same object again, because cat and animal point to
// the same place.

有些人建议不要删除两次,我建议根本不要显式调用 delete。使用智能指针:

auto animal = std::make_unique<Cat>();
Cat &cat = *animal;

animal->cry();
cat.cry(); // Calls the same function as above.

Unique 指针将为您处理对象的删除。

关于c++ - 这是抽象的但具有非虚拟析构函数删除导致错误。这是为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69081119/

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