所以,我有一个班级
class Room {
public:
Room();
~Room();
tile::Tile* tile[11][7]; // Owned
}
有一个构造函数和析构函数,tile::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();
}
答案 0 :(得分:0)
如果这是所有代码,那么它看起来没问题。 我假设您有更多的代码在析构函数之前删除其中的一些条目。
无论如何,您必须在删除后立即指定NULL
指针,因此对delete
的其他调用不会引发异常。
如果还有其他代码在析构函数之前调用delete
并且没有为指针分配NULL
,那么这将解释异常。
答案 1 :(得分:0)
好吧,所以我的代码的问题实际上是构建Room对象。我有一个循环使用默认构造函数(即rooms[i][j] = Room()
)初始化一个5乘5的数组。删除它(因为C ++将自动使用数组的默认构造函数)解决了这个问题!
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();
}