创建一个数组℃的深拷贝++(Create a deep copy of an array C++)

2019-07-29 07:02发布

我试图解决我的程序有些问题,它似乎有要么是与我的拷贝构造函数或析构函数的问题。 我得到一个内存异常。

任何帮助将我不胜感激谢谢

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

Answer 1:

你不能只是memcpy随机对象,实际上你需要用自己的复制操作复制它们。

string最有可能有一个指针指向堆分配存储。 如果你把它复制按位,呼吁原来的字符串析构函数无效的“复制”字符串的数据。

使用类似std::copy正确做到这一点。

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


Answer 2:

我不会建议你复制的字符串你的方式。 作为字符串持有引用堆内存,你实际上是复制指针,因此在两个数组中的字符串是共享内存。 这是不是很C ++ - ISH和相当危险的。 我会建议你使用赋值运算符或拷贝构造函数的字符串(是做一个循环)。



Answer 3:

该字符串也有动态内存,所以你必须要经过的每个字符串,使它的一个副本。

修复程序会复制你的阵列,而不是存储器复制的内部的每个字符串。 唯一的例外是由具有相同的指针到一块内存两个不同的串并都试图释放它。



Answer 4:

该代码没有任何意义。 首先,你的成员初始化该对象传递给复制,通过初始化列表中的值。 然后你在同样的成员分配内存,并再次复制一切。

最有可能您要复制的垃圾数据为未初始化的指针。 摆脱初始化列表的:readArray(a.readArray),arraysize(a.arraysize)



文章来源: Create a deep copy of an array C++