0

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

任何帮助将不胜感激谢谢

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

4 回答 4

10

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

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

使用类似的东西std::copy来正确地做到这一点。

#include <algorithm>
...
std::copy(a.readArray, a.readArray+arraysize, readArray);
于 2012-05-07T13:36:05.570 回答
6

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

于 2012-05-07T13:34:45.757 回答
0

字符串还具有动态内存,因此您必须遍历每个字符串并对其进行复制。

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

于 2012-05-07T13:38:36.783 回答
0

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

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

于 2012-05-07T13:54:14.890 回答