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

时间:2014-06-18 18:00:21

标签: c++ memory destructor

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

Room::~Room()
{
  delete[] sides;
}

MapSites的析构函数就是这样:

virtual ~MapSite() {}

构造函数如下所示:

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

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

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;

我收到了警告:

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

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

1 个答案:

答案 0 :(得分:6)

通常,您不应delete[]使用语法

声明的数组
T a[N];

其中T是某种类型,N是某种整数。

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

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

另一方面,您可能想要delete数组sides的每个元素,因为每个元素本身都是一个指针。 delete[]语法执行此操作。你必须写

for (int i = 0; i < 5; i++) {
    delete sides[i];
}