创建数组C ++的深层副本

时间:2012-05-07 13:31:56

标签: c++ arrays destructor copy-constructor

我尝试解决程序中的一些问题,看起来我的复制构造函数或析构函数存在问题。我得到了一个内存异常。

任何帮助我都会感激 谢谢

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];
    }

4 个答案:

答案 0 :(得分:10)

您不能只是memcpy随机对象,您需要使用其复制运算符实际复制它们。

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

使用类似std::copy的内容来正确执行此操作。

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

答案 1 :(得分:6)

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

答案 2 :(得分:0)

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

修复将复制数组内的每个字符串而不是memcopy。例外是来自两个不同的字符串,它们具有指向一块内存的指针,并且都试图释放它。

答案 3 :(得分:0)

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

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