我有这样的课程:
游戏:
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;
}
}
板场:
class BoardField {
private:
ChessPiece* m_piece;
....
public:
BoardField::~BoardField() {
delete m_piece;
}
}
在程序结束时,我在~BordField 中出现错误:
抛出异常:读取访问冲突。这是 0xFDFDFDFD。
我是否使析构函数不正确?从多维数组中清除内存的最佳方法是什么?
你的设计有两个基本缺陷:
BoardField
s没有明确的所有权:有人创建了它,其他人删除了它。如果您非常谨慎,它可以工作,但很容易出错。Game
的任何BoardField
第一个对象的副本或 a 的副本,将删除m_piece
指针,当第二个对象被销毁时销毁后,它会尝试再次删除相同的指针,即 UB。还有第三个重要问题:您过度使用原始指针:
BoardField* m_board_fields[8][8]
)。如果要保持其大小动态,请使用向量。BoardField m_board_fields[8][8]
)。ChessPiece
,不如使用shared_ptr<ChessPiece>
: 您不必担心浅指针复制和双重删除;该shared_ptr
会自己照顾自己和销毁对象,如果它不再使用。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句