0

基于 valgrind,我相信我的错误源于这些人,因为错误发生在我将一个新集合分配给另一个集合之后。Set 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;
}
4

3 回答 3

2

您有一个动态分配的数组Pool,您在复制构造函数和赋值运算符中进行浅拷贝。因此,您将有多个对象试图删除同一个数组。

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

于 2012-11-01T17:30:55.920 回答
0

所以你们没事。但是对于和我有同样问题的人来说,这是我为解决它所做的。

Pool = new int[A.capacity()];
*Pool = *A.Pool;
Num = A.size();
Cap = A.capacity();
于 2012-11-01T19:40:28.797 回答
0

您正在执行浅拷贝,其结果是拷贝中涉及的源对象和目标对象共享对单个内存块的相同引用。自然,当这两个对象被销毁时,第一个对象会delete[]占用这块内存,第二个对象也会这样做,从而导致“双重释放”。

您可以Pool在副本的目的地分配一个新的然后使用memcpy(或类似的)复制内容,或者使用现有的容器(例如 a std::vector<>)来存储池的内容并依赖标准库的复制实现。如果一个浅拷贝真的是你想要的,Pool两个实例共享相同的,你可以使用某种共享句柄到内存池(参见这个使用 astd::shared_ptr包装数组的例子)。

于 2012-11-01T17:36:53.703 回答