【问题标题】:g++ gives the warning message deleting array in virtual destructor, what does this mean?g++ 在虚拟析构函数中给出删除数组的警告信息,这是什么意思?
【发布时间】:2014-08-09 03:23:17
【问题描述】:

我有一个继承自抽象类 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;

有人可以向我解释一下这个警告是什么意思吗?我应该/如何禁止它?我无法从谷歌快速搜索中找到任何东西。谢谢!

【问题讨论】:

  • 首先,sides[i] = nullptr; 不是sides[i] == nullptr;
  • 其次,你试图删除一个具体的数组。 sides[5] 不需要删除,也许它的元素可以。
  • @Gluttton side 是一个大小为 5 的数组,其元素是指向 MapSite 对象的指针。
  • 呃,我现在觉得自己很蠢,谢谢! @40two
  • 这里真正的问题是你应该声明std::array&lt;std::unique_ptr&lt;MapSite&gt;, 5&gt; sides; 并删除你的析构函数。

标签: c++ memory destructor


【解决方案1】:

一般来说,你不应该 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];
}

【讨论】:

  • “一般来说你不应该...”暗示在某些情况下它是可以的。可以肯定的是,delete[] 不是来自 new[] 的数组从不 OK。
  • @AndrewMedico 我也想不出什么时候可以,但是由于 gcc 说“默认启用”,我想知道是否有一些我不够聪明的情况。跨度>
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2014-04-17
相关资源
最近更新 更多