我有一个继承自抽象类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;
有人可以向我解释这个警告意味着什么吗?我应该/怎样才能抑制它?我从谷歌搜索中找不到任何东西。谢谢!
答案 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];
}