【问题标题】:Copy 2d array of structures c++复制二维结构数组c ++
【发布时间】:2019-04-13 05:06:27
【问题描述】:

我正在创建“船舶”游戏。我生成了 mField,这将是我的模板,用船只填充敌方区域。为此,我想将 mField 复制到 eField 中。

我的 mField 是结构“字段”的动态二维数组,它在我的 cpp 文件中填充如下:

mField = new Field*[x+3];
    for (int i = 0; i < x+3; ++i)
        mField[i] = new Field[y+3];

并在我的头文件中这样声明

Field **mField;

现在复制我试过了

memcpy(&eField, &mField, sizeof(&mField));

虽然现在当我用船填充我的 mField 时,我在敌方领域看到了 mField 的精确副本,而不是它是干净的领域。 这就是我将我的字段传递给改变我的字段的函数的方式:

void Map::changeField(int x, int y, string ciag,Field **field) {
    ...
}

我是否在函数中犯了一些错误,即它同时更改了两个数组,或者我以错误的方式复制了数组?

【问题讨论】:

    标签: c++ arrays multidimensional-array struct


    【解决方案1】:

    您正在将敌人字段指针复制到您自己的字段,这不起作用,您正在共享字段。

    使用std::vector&lt;Filed&gt;((x+3)*(y+3)),即一个!D 字段数组,并将其作为2D 访问。

    如果您需要使用 2D 数组,请像以前一样为每一行再次分配新字段(提示:创建一个以通用方式创建 mField 和 eField 的函数)。

    【讨论】:

    • eField 和 mField 应该是这样一个向量。然后在与两个字段之一交互时传递向量。除了内存安全之外,这还明确地不在两个字段之间共享对象。
    • 你的教授不是很聪明...现代 C++ 不是要自己处理内存。无论如何,然后分配一个大的字段数组,而不是为每个字段分配一个二维数组。然后添加显式删除来删除每个数组。
    • @MatthieuBrucher 我同意您对现代 C++ 的看法,因为有工具和技术可以在生产代码中为您处理这个问题,但是当涉及到课程时,我可以理解教授或老师在哪里来自。它仍然是该语言的一个有效部分,他们正在尝试教他们基础知识,以便他们学习和了解它们是什么,如何正确使用它们,它们的优缺点以及如何避免潜在的内存泄漏、无效指针、悬空指针和引用等
    • @FrancisCugler 教授 C 风格的数组只是糟糕。它们不是正确的类型。如果您要教授“低水平”的东西,std::allocatorstd::aligned_storage 和/或placement-new 会很多更好。
    • @Francis 我的意思是使用数组/向量比正确使用 [] 代码更少。而且更难做错
    【解决方案2】:

    memcpy 只是将 pointers 复制到您的底层数组。它没有复制指针所指向的内容

    您的复制功能必须分配新内存并复制内容(又名深拷贝):

    eField = new Field*[x+3];
    for (int i = 0; i < x+3; ++i)
    {
        eField[i] = new Field[y+3];
        memcpy(efield[i], mField[i], y+3);
    }
    

    【讨论】:

    • 呃,由于某种原因它仍然无法正常工作。我什至添加了第三个数组 hField,当我绘制它时,它是 mField 的精确副本。
    • 那是因为memcpy(efield[i], mField[i], y+3);错了,这并没有将mField的内容复制到eFild,而只是复制了y+3的第一个字节。
    猜你喜欢
    • 2012-02-28
    • 2023-04-08
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多