为什么这种虚拟驱动器在C 中不起作用

Why does this virtual destructor does not work in C++?

本文关键字:不起作用 驱动器 虚拟 为什么      更新时间:2023-10-16

我正在尝试删除子类的对象。尽管我使用了虚拟破坏者,但我仍会收到错误消息:

malloc: *** error for object 0x7ffee08bab50: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

我的代码是:

#include <iostream>
using namespace std;
class Animal{
  protected:
    int age;
  public:
    Animal(){
      age = 0;
      cout << "ctor Animal" << endl;
    }
    virtual ~Animal(){
      cout << "dtor Animal" << endl;
    }
};
class Mammal : public Animal{
  public:
    Mammal(){
      age = 0;
      cout << "ctor Mammal" << endl;
    }
    ~Mammal(){
    cout << "dtor Mammal" << endl;
    }
};
int main(){
  Mammal *dog = new Mammal();
  delete &dog;
}

如果有人帮助我,我会非常感谢!

@songyuanyao是正确的: delete dog而不是 delete &dog。您已经分配了其地址存储在dog中的内存。&dog的地址,其中该地址存储,可能是在堆栈上。因此,&dog是您没有newMammal **,而是由堆栈上的编译器自动创建的。由于您没有new,因此无法delete

顺便说一句,如果您想查看虚拟破坏者的效果,请使用Animal *dog = new Mammal();。由于您将dog宣布为Mammal并将其创建为Mammal,因此,无论它是否虚拟,正确的破坏者都会被称为。

您分配了一个Mammal*,然后删除了指向堆栈的Mammal**。不允许删除堆栈上的东西。

delete dog;

是正确的。