C++ 销毁一组数组

C++ 销毁一组数组,c++,destructor,access-violation,C++,Destructor,Access Violation,我有一个网格类,如下所示。在我的程序中使用它可以正常工作,直到main()函数返回,然后出现错误消息,程序由于未捕获的异常而崩溃。如果我注释掉析构函数,这个类就可以正常工作。实现这个析构函数的正确方法是什么 如果我只是delete[]grid,我假设其中的数组没有被释放 确切错误:Battleship.exe中0x000869F5处的未处理异常:0xC0000005:访问冲突写入位置0xDDDD class Grid { private: int numRows; int nu

我有一个网格类,如下所示。在我的程序中使用它可以正常工作,直到main()函数返回,然后出现错误消息,程序由于未捕获的异常而崩溃。如果我注释掉析构函数,这个类就可以正常工作。实现这个析构函数的正确方法是什么

如果我只是
delete[]grid
,我假设其中的数组没有被释放

确切错误:Battleship.exe中0x000869F5处的未处理异常:0xC0000005:访问冲突写入位置0xDDDD

class Grid
{
private:

    int numRows;
    int numCols;
    char** grid; // array of arrays / pointer to pointer to char

public:

    /*****************************************************************
    Constructor()
    *****************************************************************/
    Grid() : numRows(0), numCols(0)
    {
    }

    /*****************************************************************
    Constructor(int, int)
    *****************************************************************/
    Grid(int numRows, int numCols) : numRows(numRows), numCols(numCols)
    {
        grid = new char*[numRows];
        for (int arr = 0; arr < numRows; ++arr) {
            grid[arr] = new char[numCols];
        }
    }

    /*****************************************************************
    Destructor NEEDS MAJOR EDIT AS IT IS CAUSING THE PROGRAM TO CRASH
    *****************************************************************/
    ~Grid()
    {
        for (int i = 0; i < numRows; ++i)
        {
            delete[] grid[i]; //delete all subarrays of grid
        }
        delete[] grid; //delete grid
    }
}
类网格
{
私人:
int numRows;
int numCols;
char**grid;//数组数组/指向char的指针
公众:
/*****************************************************************
构造函数()
*****************************************************************/
网格():numRows(0),numCols(0)
{
}
/*****************************************************************
构造函数(int,int)
*****************************************************************/
网格(int numRows,int numCols):numRows(numRows),numCols(numCols)
{
网格=新字符*[numRows];
对于(int-arr=0;arr
可能是违规。正确的方法是使用
std::vector
(可能是
std::vector>
),要删除析构函数,默认构造函数应该将
grid
设置为
nullptr
,您应该在析构函数中检查。此外,您至少需要实现一个复制构造函数和复制赋值操作符。为了避免所有这些麻烦,在最小的限度内使用<代码>矢量网格,不要实现任何东西,使用标准库。@ J.VyWoWyd使用标准库中可用的设施是学习C++时尽可能多做的事情。手动内存管理是一个高级主题,您应该在熟练掌握该语言后尝试<在
nullptr
上的code>delete[]是一个NOP,但您的代码的问题是
grid
在默认构造函数中未初始化,因此它可能不是
nullptr
,您将在析构函数中遇到未定义的行为。