Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 析构函数顺序_C++_Destructor_Object Lifetime - Fatal编程技术网

C++ 析构函数顺序

C++ 析构函数顺序,c++,destructor,object-lifetime,C++,Destructor,Object Lifetime,我有这样的课程: 游戏: 程序结束时,我在~BordField中发现错误: 引发异常:读取访问冲突。 这是0xFDFDFDFD 我把我的析构函数弄错了吗?从多维数组中清除内存的最佳方法是什么 您的设计有两个基本缺陷: 没有明确的BoardField的所有权:有人创建它,有人删除它。如果你非常谨慎,它可以工作,但它很容易出错 您无法确保:如果您有任何代码段,其中您创建了游戏或任何BoardField的副本,则第一个被销毁的对象将删除m_段指针,当第二个对象被销毁时,它将再次尝试删除同一指针,即U

我有这样的课程:

游戏:

程序结束时,我在~BordField中发现错误:

引发异常:读取访问冲突。 这是0xFDFDFDFD


我把我的析构函数弄错了吗?从多维数组中清除内存的最佳方法是什么

您的设计有两个基本缺陷:

  • 没有明确的
    BoardField的所有权:有人创建它,有人删除它。如果你非常谨慎,它可以工作,但它很容易出错
    
  • 您无法确保:如果您有任何代码段,其中您创建了
    游戏
    或任何
    BoardField
    的副本,则第一个被销毁的对象将删除
    m_段
    指针,当第二个对象被销毁时,它将再次尝试删除同一指针,即UB
还有第三个重要问题:您过度使用原始指针:

  • 如果m_board_fields是固定大小的2d数组,则将其设置为固定大小数组(也称为
    BoardField*m_board_fields[8][8]
    )。如果要使其大小保持动态,请使用向量
  • 如果预期存在某种多态性,则m_board_字段的单元格可以是指针。但这里似乎不是这样,因为显然ChessPiece是多态类。因此最好使用普通字段而不是指针(aka
    BoardField m_board_fields[8][8]
  • 最后,与其使用原始指针指向
    棋子
    ,不如使用
    共享的\u ptr
    :您不必担心指针的浅拷贝和双重删除;
    shared_ptr
    将自行处理,并在不再使用时销毁该对象
在类定义中只有几行表示有错误,这是一个坏迹象。请提供。1) 例如:如果
m_-piece
从未初始化-它包含不确定的值,并且如果您尝试取消引用它(例如,通过使用
delete
),您的程序将显示未定义的行为。2) 我们可以看到您创建了一个二维数组
m_board_fields
,它存储指向
BoardField
的指针。这种数组的内容在哪里初始化?由于析构函数尝试删除这些指针,并且再次取消对未初始化指针的引用是未定义的行为。为什么不使用
std::array
和一些辅助函数来实现索引,而不是执行大量堆分配?为什么不使用
BoardField m_board_fields[8][8]
?使用
std::vector
std::array
。您正在删除但未分配
m_board_字段[i][j]
。还要注意类似(intj=0;i<8;j++)的
for
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;
    }
}