我尝试解决程序中的一些问题,看起来我的复制构造函数或析构函数存在问题。我得到了一个内存异常。
任何帮助我都会感激 谢谢
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];
}
答案 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)
。