我有这样的课程:
游戏:
class Game {
private:
BoardField*** m_board_fields;
public:
Game() {
m_board_fields = new BoardField**[8];
for (int i = 0; i < 8; i++) {
m_board_fields[i] = new BoardField*[8];
}
}
Game::~Game() {
for (int i = 0; i < 8; i++) {
for (int j = 0; i < 8; j++) {
delete m_board_fields[i][j];
}
delete[] m_board_fields[i];
}
delete[] m_board_fields;
}
}
BoardField:
class BoardField {
private:
ChessPiece* m_piece;
....
public:
BoardField::~BoardField() {
delete m_piece;
}
}
在程序结束时我在~BordField中出错:
抛出异常:读取访问冲突。这是0xFDFDFDFD。
我的析构函数是不正确的?从多维数组中清除内存的最佳方法是什么?
您的设计存在两个根本缺陷:
BoardField
s没有明确的所有权:有人创建它,其他人删除它。如果你非常谨慎但它容易出错,它可以工作。Game
或任何BoardField
的副本,第一个被破坏的对象将删除m_piece
指针,当第二个对象被销毁时,它' ll尝试第二次删除相同的指针,即UB。还有第三个重要问题:你过度使用原始指针:
BoardField* m_board_fields[8][8]
)。如果要保持动态大小,请使用向量。BoardField m_board_fields[8][8]
)。ChessPiece
,更好地使用shared_ptr<ChessPiece>
:你不必担心浅指针副本和双删除;如果不再使用,shared_ptr
会照顾好自己并摧毁物体。