【问题标题】:Create a deep copy of an array C++创建数组 C++ 的深层副本
【发布时间】:2012-05-16 00:21:38
【问题描述】:

我正在尝试解决程序中的一些问题,但我的复制构造函数或析构函数似乎存在问题。我遇到了内存异常。

如有任何帮助,我将不胜感激 谢谢

ArrayStorage::ArrayStorage(const ArrayStorage &a):readArray(a.readArray),arraysize(a.arraysize)
{
    readArray = new string[arraysize]; //create the array

    memcpy (readArray,a.readArray,sizeof(string)*arraysize);//Copy the values of bytes from the location pointed at by the souce and destination.
}

ArrayStorage::~ArrayStorage(void)
{
    delete[](readArray);//deconstuctor to delete the array.
}

这会是复制数组而不是 memcpy 的更好方法吗:

for (int i = 0 ; i < arraysize ; i ++)
    {
        readArray[i] = a.readArray[i];
    }

【问题讨论】:

    标签: c++ arrays destructor copy-constructor


    【解决方案1】:

    我不建议您按照自己的方式复制字符串。由于字符串包含对堆内存的引用,因此您实际上复制了指针,因此两个数组中的字符串共享内存。这不是很 c++-ish 并且非常危险。我建议您对字符串使用赋值运算符或复制构造函数(是的,做一个循环)。

    【讨论】:

    • 或者甚至使用vector&lt;string&gt;,其中执行深层复制就像vector&lt;string&gt; newlist = oldlist; 一样简单。
    • @Benj 同意 - 这是一个更好的选择,但与问题不太相关 - 他在问为什么这不起作用而不是如何做到 :)
    • 复制数组的最佳方法是什么?
    • 我很想为此使用矢量,但不幸的是我不允许这样做:\ 最好的其他方式是什么?
    • @BrianPeach 使用 Benj 提出的 vector 代替动态数组。如果您确实需要按照您的描述复制数组,请使用 std::copy(a.readArray, a.readArray + a.arraysize, readArray);注意:在调用 copy 之前,您仍然需要为 readArray 分配内存。
    【解决方案2】:

    您不能只是 memcpy 随机对象,您需要使用它们的复制操作符实际复制它们。

    string 很可能持有指向堆分配存储的指针。如果按位复制,则对原始字符串调用析构函数会使“复制”字符串的数据无效。

    使用std::copy 之类的东西来正确执行此操作。

    #include <algorithm>
    ...
    std::copy(a.readArray, a.readArray+arraysize, readArray);
    

    【讨论】:

    • 如何在不使用向量的情况下使用 std::copy(不允许在这项工作中使用向量)?对不起,如果这是一个愚蠢的问题。
    • 已编辑。顺便说一句,如果初始化列表中的 readArray 在复制构造函数中是无用的,则您的初始化 - 您在正文中覆盖它。
    • 感谢您,但是我遇到了 2 个错误,1. 没有重载函数“std::copy”的实例与参数列表匹配。 2.没有操作符“+”匹配这些操作数:S
    • readArray的类型是什么,你是怎么声明的? (顺便说一句,您的 for 循环也应该可以正常工作。)
    • 那么它应该可以工作。在这里工作。 + 运算符错误没有理由,它是指针算术。请说明您是如何声明该成员的。
    【解决方案3】:

    字符串也有动态内存,所以你必须遍历每个字符串并复制它。

    解决方法是复制数组中的每个字符串而不是 memcopy。例外情况是两个不同的字符串具有相同的指向一块内存的指针并且都试图释放它。

    【讨论】:

      【解决方案4】:

      该代码没有任何意义。首先,通过初始化列表将成员初始化为要复制的对象传递的值。然后为相同的成员分配内存并再次复制所有内容。

      您很可能正在将垃圾数据复制到未初始化的指针中。去掉初始化列表:readArray(a.readArray),arraysize(a.arraysize)

      【讨论】:

      • 好吧,初始化列表是为了消除我遇到的一些 parasoft 错误。
      • @BrianPeach 初始化列表是你得到内存异常的原因。
      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      相关资源
      最近更新 更多