删除指针数组时出现堆损坏

时间:2017-04-15 16:29:11

标签: c++ heap new-operator delete-operator heap-corruption

所以,我有一个班级

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();
}

2 个答案:

答案 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();
}