2012-11-01 38 views
0

我相信我的错误,从这些家伙茎,因为在我分配了一套新的另一套错误发生。设置Z - > A^B(返回Set的交集操作)。我只是不确定我做错了什么,任何帮助将不胜感激!C++双重释放或腐败(fasttop) - 不知道从哪里基于Valgrind的误差为

Set::~Set() 
{ 
     Cap = 0; 
     Num = 0; 
     delete [] Pool; 
     Pool = NULL; 
} 
Set::Set(const Set &A) 
{ 
     Cap = A.capacity(); 
     Num = A.size(); 
     Pool = A.Pool; 
} 
Set& Set::operator=(const Set &X) 
{ 
     Cap = X.capacity(); 
     Num = X.size(); 
     Pool = X.Pool; 
     return *this; 
} 
+1

'Pool = A.Pool'你似乎需要制作一个池副本,而不是指向另一个Set池。这可能是你的错误。 – andre

+0

如果有人可以给我一个如何在这个例子中做一个很好的副本的例子,我已经尝试了多件事情,但似乎没有任何工作。 – sharkman

回答

2

你有一个动态分配的数组Pool,您是浅拷贝你的拷贝构造函数和赋值操作符。所以你将有多个对象试图删除同一个数组。

您需要对Pool进行“深度复制”,即创建一个包含原始元素副本的新动态分配数组。为此,您需要知道原始数组的大小。最简单的解决方案是使用std::vector。那么你甚至不需要提供你自己的拷贝构造函数和赋值操作符。编译器合成的就足够了。

+0

所以我可以做点像 'Set Z; Z.Num = A.size(); Z.Cap = A.capacity(); 为(无符号Y = 0; Y sharkman

+0

@sharkman如果你使用了一个矢量,你甚至不需要做大部分的工作。如果Cap对应'capacity()','Num'对应'size()',那么你可以去掉这些数据成员。而且您不必循环复制矢量。如果你保存数组,然后使用'std :: copy'来完成深层复制。 – juanchopanza

0

你正在做浅拷贝,其结果是,参与复制共享源和目标对象相同的参考到的存储器中的单个块。当然,当这两个对象被破坏时,第一个将会是这块内存,然后第二个将会执行相同的操作,从而产生“双倍空闲”。

您可以在副本中的目标分配一个新的Pool然后用memcpy(或类似)复制的内容,或使用现有容器(例如,一个std::vector<>)存储池的内容,依靠在标准库的复制实现上。如果浅表副本是你想要的真的是,通过两个实例共享同一个Pool,你可以使用某种共享的句柄内存池(请参阅使用std::shared_ptr包装数组的this example)。

0

所以你们都是对的。但对于与我相同问题的人来说,这是我所做的解决之道。

Pool = new int[A.capacity()]; 
*Pool = *A.Pool; 
Num = A.size(); 
Cap = A.capacity(); 
相关问题