gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:54:32 25 4
gpt4 key购买 nike

我有一个继承自抽象类 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)成员如下所示:

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;

有人可以向我解释这个警告的含义吗?我应该/如何抑制它?我无法通过快速谷歌搜索找到任何东西。谢谢!

最佳答案

一般来说,你不应该delete[]一个使用语法声明的数组

T a[N];

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

首先考虑如果数组分配在堆栈上(自动存储持续时间)会发生什么。然后它将在其作用域结束时自动释放,因此您不应对其调用 delete

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

另一方面,您可能想要删除数组的每个元素,因为每个元素本身就是一个指针。 delete[] 语法不会这样做。你必须写

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

关于c++ - g++ 在虚拟析构函数中给出删除数组的警告消息,这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24292194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com