基于valgrind我相信我的错误源于这些人,因为错误发生在我将一个新集合分配给另一个集合之后。设置Z - > A ^ B(返回Set的交集操作)。我只是不确定我做错了什么,非常感谢任何帮助!
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;
}
答案 0 :(得分:2)
您有一个动态分配的数组Pool
,您可以在复制构造函数和赋值运算符中进行浅层复制。因此,您将有多个对象尝试删除相同的数组。
您需要制作Pool
的“深层副本”,即创建一个包含原始元素副本的新动态分配数组。为此,您需要知道原始数组的大小。最简单的解决方案是使用std::vector
代替。那么你甚至不需要提供自己的复制构造函数和赋值运算符。编译器合成的就足够了。
答案 1 :(得分:0)
您正在执行浅拷贝,其结果是副本中涉及的源对象和目标对象共享对单个内存块的相同引用。当然,当两个物体被摧毁时,第一个物体将delete[]
这个记忆块,然后第二个物体会做同样的事情,导致“双重自由”。
您可以在副本的目标位置分配新的Pool
,然后使用memcpy
(或类似)复制内容,或使用现有容器(例如{{1} })存储池的内容并依赖标准库的复制实现。如果浅层副本确实是您想要的,并且两个实例共享相同的std::vector<>
,您可以使用某种内存池的共享句柄(请参阅使用Pool
的{{3}}包装数组)。
答案 2 :(得分:0)
所以你们都没事。但是对于那些和我一样有问题的人来说,就是我要解决的问题。
Pool = new int[A.capacity()];
*Pool = *A.Pool;
Num = A.size();
Cap = A.capacity();