我对下面的课程有问题。我认为问题出在字符串数组上,因为我做了另外两个类,问题是一样的。当我运行程序时,它抛出“双重释放或损坏”,但我不认为任何双重损坏是可能的。问题与输入字符串作为引用或作为Add方法中的公共参数是相同的。
class WareH
{
public:
WareH(void)
{
first = true;
rows = 1;
inLine = 0;
cnt = 0;
max = 2;
cL = 0;
strs = new string[max];
}
~WareH(void)
{
delete [] strs;
}
bool Add(string& str, int ending)
{
if (first)
inLine++;
else
cL++;
if (ending == 0)
{
if (first)
first = false;
if (cL != inLine)
return false;
rows++;
}
strs[cnt++] = str;
Bigger();
return true;
}
void Bigger(void)
{
if(max == cnt)
{
max *= 2;
string* tmp = new string[max];
for (int i = 0; i < cnt; i++)
tmp[i] = strs[i];
delete [] strs;
strs = tmp;
}
}
friend ofstream& operator<<(ofstream& of,WareH war)
{
for (int a = 0; a < war.cnt; a++)
of << war.strs[a] << endl;
return of;
}
private:
bool first;
int rows, inLine, cnt, max, cL;
string* strs;
};发布于 2013-03-14 20:03:39
当一个类管理资源并在其析构函数中释放它们时,您必须考虑Rule of Three,以确保复制一个对象不会导致两个对象管理相同的资源。
这就是这里发生的事情:默认的复制构造函数和复制赋值操作符将复制指针,给出两个对象,这两个对象都将在销毁时尝试删除相同的数组。解决方案包括:
std::vector而不是自己管理内存分配。发布于 2013-03-14 20:06:24
当我运行程序时,它抛出“双重释放或损坏”,但我不认为任何双重损坏是可能的。
有根据的猜测如下:
问题不在于您所展示的代码,而在于客户端代码。以下是我认为会发生的事情:
您编写了客户端代码来实例化(或按值赋值或返回或存储在std容器中) WareH实例,并且由于您没有定义复制构造函数和赋值操作符(请参阅"The Big Three"),它们最终将从源对象复制值。当这些实例中的第一个实例(彼此分配)被删除时,它们会删除strs指针。
当删除第二个实例时,它们会删除之前删除的相同strs指针(因为默认的复制构造函数和赋值操作符不会复制已分配的内存,而只是复制指针)。
解决方案(如果这确实是问题所在):
strs实现为std::vector<std::string>,而不是std::string*和std::string*https://stackoverflow.com/questions/15408401
复制相似问题