g ++在虚析构函数中给出了删除数组的警告消息,这是什么意思?

Kyl*_*yle 0 c++ memory destructor

我有一个继承自抽象类MapSite的类Room.Room的析构函数如下所示:

Room::~Room()
{
  delete[] sides;
}
Run Code Online (Sandbox Code Playgroud)

MapSites的析构函数就是这样的:

virtual ~MapSite() {}
Run Code Online (Sandbox Code Playgroud)

构造函数如下所示:

Room::Room() : inventory(new Inventory) 
{
  for(size_t i = 0; i < 5; i++)
    sides[i] == nullptr;
}
Run Code Online (Sandbox Code Playgroud)

房间的私人成员看起来像这样:

private:
  int roomNumber = INVALID_ROOM_NUMBER; // Room number
  MapSite *sides[5]; // Room roof/floor/wall/exits
  std::string name; // Name of room
  std::string description; // Room description
  std::string lookDescription; // Extra description shown on look command
  std::string filename = INVALID_ROOM_FILENAME; // Lua file associated with room
  bool visited = false;
  std::unique_ptr<Inventory> inventory;
Run Code Online (Sandbox Code Playgroud)

我收到了警告:

room.cxx: In destructor ‘virtual Room::~Room()’:
room.cxx:45:12: warning: deleting array ‘((Room*)this)->Room::sides’ [enabled by default]
   delete[] sides;
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这个警告意味着什么吗?我应该/如何抑制它?我从谷歌搜索中找不到任何东西.谢谢!

Bri*_*ian 9

通常,您不应该delete[]使用语法声明的数组

T a[N];
Run Code Online (Sandbox Code Playgroud)

哪里T是某种类型,N是一些整数.

首先考虑如果在堆栈上分配数组会发生什么(自动存储持续时间).然后它将在其范围的末尾自动解除分配,因此您不应该调用delete它.

现在考虑a具有动态存储持续时间会发生什么.将数组a声明为数组类型时,无法动态分配数组.调用new为您提供指针,但您无法将该指针值分配给数组变量.所以a必须是动态分配对象的子对象.但在这种情况下,a将在创建完整对象时分配内存,并在销毁完整对象时释放内存.再次,无需手动管理内存a.

在另一方面,它可能是你想要delete的每个元素的数组sides,因为每个元素本身就是一个指针.该delete[]语法并没有做到这一点.你必须写

for (int i = 0; i < 5; i++) {
    delete sides[i];
}
Run Code Online (Sandbox Code Playgroud)