gpt4 book ai didi

c++ - 删除指针数组时堆损坏

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

所以,我有一个类

class Room {
public:
Room();
~Room();
tile::Tile* tile[11][7]; // Owned
}

有构造函数和析构函数,tile::Tile是抽象基类,指针也是。指针数组,需要像这样在构造函数中填充。

Room::Room() {
for (std::size_t i = 0; i < 11; ++i) {
for (std::size_t j = 0; j < 7; ++j) {
this->tile[i][j] = new tile::Empty();
}
}
}

根据我的理解,我还应该在 Room 的析构函数中删除它们。

Room::~Room() {
for (std::size_t i = 0; i < 11; ++i) {
for (std::size_t j = 0; j < 7; ++j) {
delete this->tile[i][j];
}
}
}

但是,这样做会导致返回代码 0xc0000374,这是一个堆损坏错误。为什么会发生此损坏错误?

最小示例

class Tile {};

class Empty: public Tile {
public:
Empty() {}
};

class Room {
public:
Tile* tiles[5];
Room() {
for (int i = 0; i < 5; ++i) {
tiles[i] = new Empty();
}
}
~Room() {
for (int i = 0; i < 5; ++i) {
delete tiles[i];
}
}
};

class Maze {
public:
Room rooms[5];
Maze() {
for (int i = 0; i < 5; ++i) {
rooms[i] = Room();
}
}
};

int main() {
Maze maze = Maze();
}

最佳答案

如果这是所有代码,那么它看起来没问题。我假设您有更多代码可以在析构函数之前删除其中一些条目。

在任何情况下您必须在删除后立即为指针分配一个NULL,这样对delete 的额外调用将​​不会引发异常。

如果有其他代码确实在析构函数之前调用了 delete 并且没有将 NULL 分配给指针,那么这将解释异常。

关于c++ - 删除指针数组时堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43428461/

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