Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++_Pointers_Copy Constructor - Fatal编程技术网

C++ 为动态二维数组创建正确的副本构造函数

C++ 为动态二维数组创建正确的副本构造函数,c++,pointers,copy-constructor,C++,Pointers,Copy Constructor,调用复制构造函数时,我的程序是seg错误。这是我的网格类的构造函数的外观: Grid::Grid(unsigned int grid_size) { size = grid_size; grid = new char *[size]; for(int i = 0; i < size; i++) { grid[i] = new char[size]; } } Grid::Grid(无符号整数网格大小){ 尺寸=网格尺寸; 网格=新字符*[大小

调用复制构造函数时,我的程序是seg错误。这是我的网格类的构造函数的外观:

Grid::Grid(unsigned int grid_size) {
    size = grid_size;
    grid = new char *[size];
    for(int i = 0; i < size; i++) {
        grid[i] = new char[size];
    }
}
Grid::Grid(无符号整数网格大小){
尺寸=网格尺寸;
网格=新字符*[大小];
对于(int i=0;i
这是导致问题的复制构造函数:

Grid::Grid(Grid const &other_grid) {
    size = other_grid.size;
    grid = new char *[other_grid.size];
    for(int i = 0; i < size; i++) {
        grid[i] = new char[size];
    }

    for(int i = 0; i < size; i++) {
        for(int j = 0; j < size; j++) {
            grid[i][j] = other_grid.grid[i][j];
        }
    }
}
Grid::Grid(Grid const和其他网格){
尺寸=其他网格尺寸;
网格=新字符*[其他网格大小];
对于(int i=0;i
析构函数

Grid::~Grid() {
for(int i = 0; i < size; i++) {
    delete [] grid[i];
}

delete [] grid;
}
Grid::~Grid(){
对于(int i=0;i
运算符=重载

Grid & Grid::operator=(Grid const &other_grid) {
size = other_grid.size;
grid = new char *[other_grid.size];

for(int i = 0; i < other_grid.size; i++) {
    for(int j = 0; j < other_grid.size; j++) {
        grid[i][j] = other_grid.grid[i][j];
    }
}
return *this;
}
Grid和Grid::operator=(Grid const和other_Grid){
尺寸=其他网格尺寸;
网格=新字符*[其他网格大小];
对于(int i=0;i
不要把时间浪费在那种手动分配的疯狂上。使用
std::vector

class Grid {
    Grid(unsigned int size);

private:
    std::vector<std::vector<char>> grid;
};

Grid::Grid(unsigned int size)
: grid(size, std::vector<char>(size)) {}
类网格{
网格(无符号整数大小);
私人:
矢量网格;
};
网格::网格(无符号整数大小)
:网格(大小,标准::向量(大小)){}

您还可以免费获得解除分配和工作副本(如果您使用的是现代编译器,还可以进行移动)。

不要把时间浪费在那种手动分配的疯狂上。使用
std::vector

class Grid {
    Grid(unsigned int size);

private:
    std::vector<std::vector<char>> grid;
};

Grid::Grid(unsigned int size)
: grid(size, std::vector<char>(size)) {}
类网格{
网格(无符号整数大小);
私人:
矢量网格;
};
网格::网格(无符号整数大小)
:网格(大小,标准::向量(大小)){}

您还可以免费获得解除分配和工作副本(如果您使用的是现代编译器,还可以进行移动)。

编辑:更仔细地重新阅读您的代码。你的赋值操作符坏了。您忘记了分配要分配到的网格中的每一行

另外一点:您不需要所有这些分配。你只需要一个。将
grid
a
char*
替换为
char**
并以这种方式编写。我在这里遗漏了分配失败的检查

Grid::Grid(unsigned int grid_size)
    :size(grid_size), grid(0)
{
    if (size > 0)
    {
        grid = new char[size*size];
    }
}

Grid::Grid(Grid const &other_grid)
    :size(0)
{
    CopyFrom(other_grid);
}

Grid::~Grid() 
{
    if (size > 0)
    {
        delete [] grid;
        grid = 0;
    }
}

Grid& Grid::operator=(Grid const &other_grid) 
{
    CopyFrom(other_grid);
    return *this;
}

void Grid::CopyFrom(Grid const &other_grid)
{
    if (size > 0) delete [] grid;
    size = newSize;

    if (newSize > 0)
    {
        grid = new char[newSize*newSize];
        memcpy(grid, other_grid.grid, newSize*newSize);
    }
    else
    {
        grid = 0;
    }
}
如果你想访问网格中x,y点的字节,你可以这样写。(我会留给你适当的界限检查)


编辑:更仔细地重新阅读代码。你的赋值操作符坏了。您忘记了分配要分配到的网格中的每一行

另外一点:您不需要所有这些分配。你只需要一个。将
grid
a
char*
替换为
char**
并以这种方式编写。我在这里遗漏了分配失败的检查

Grid::Grid(unsigned int grid_size)
    :size(grid_size), grid(0)
{
    if (size > 0)
    {
        grid = new char[size*size];
    }
}

Grid::Grid(Grid const &other_grid)
    :size(0)
{
    CopyFrom(other_grid);
}

Grid::~Grid() 
{
    if (size > 0)
    {
        delete [] grid;
        grid = 0;
    }
}

Grid& Grid::operator=(Grid const &other_grid) 
{
    CopyFrom(other_grid);
    return *this;
}

void Grid::CopyFrom(Grid const &other_grid)
{
    if (size > 0) delete [] grid;
    size = newSize;

    if (newSize > 0)
    {
        grid = new char[newSize*newSize];
        memcpy(grid, other_grid.grid, newSize*newSize);
    }
    else
    {
        grid = 0;
    }
}
如果你想访问网格中x,y点的字节,你可以这样写。(我会留给你适当的界限检查)


不应
size=grid\u size读取<代码>大小=其他网格大小?请不要在这里输入您的代码:复制并粘贴实际失败的代码,这样我们就可以看到只有您感兴趣的问题的代码。还有,你为什么不使用
vector
s?@R.MartinhoFernandes,我知道,vectors使它更容易。但是我正在尝试学习如何在不使用C++提供的集合的情况下创建这些数据结构。但这就是我现在拥有的代码,我已经纠正了错误。复制构造函数看起来不错(如果忽略异常安全性,但这似乎不是问题所在)。一定是什么地方出了问题。也许在你的析构函数里?或复制赋值运算符?运算符=不会自动调用,但析构函数会自动调用。可以在您没有注意到的情况下调用它。但是析构函数看起来很好:S(但是操作符=是坏的!它正在泄漏以前的内存,并且没有为每一行分配新的数组!)。您可以发布导致复制失败的测试代码吗?很好:)您可能有兴趣阅读有关的,这使得编写赋值运算符更容易。不应该
size=grid\u size读取<代码>大小=其他网格大小?请不要在这里输入您的代码:复制并粘贴实际失败的代码,这样我们就可以看到只有您感兴趣的问题的代码。还有,你为什么不使用
vector
s?@R.MartinhoFernandes,我知道,vectors使它更容易。但是我正在尝试学习如何在不使用C++提供的集合的情况下创建这些数据结构。但这就是我现在拥有的代码,我已经纠正了错误。复制构造函数看起来不错(如果忽略异常安全性,但这似乎不是问题所在)。一定是什么地方出了问题。也许在你的析构函数里?或复制赋值运算符?运算符=不会自动调用,但析构函数会自动调用。可以在您没有注意到的情况下调用它。但是析构函数看起来很好:S(但是操作符=是坏的!它正在泄漏以前的内存,并且没有为每一行分配新的数组!)。您可以发布导致复制失败的测试代码吗?很好:)您可能有兴趣阅读有关的,这使得编写赋值运算符更容易。呃,请不要用复制赋值运算符实现复制构造函数。我想这是我的懒惰。修正了。呃,请不要用复制赋值操作符来实现复制构造函数。我想那是我的懒惰。固定的。