C ++拷贝构造函数0xC0000005:访问冲突写入错误

时间:2015-12-02 13:16:14

标签: c++

这是代码。这是一个在R ^ 2空间中存储点的类。

PointSet::PointSet(const PointSet& ps)
{
    if (Containment < ps.Size)
    {
        if (_Set != nullptr) delete[]_Set;
        _Set = new Point[ps.Size];
        Containment = ps.Size;
    }
    Size = ps.Size;
    for (unsigned i = 0; i != ps.Size; ++i)
    {
        _Set[i] = ps._Set[i];
    }
}

A 0xC0000005:将PointSet对象传递给函数参数时发生访问冲突写入错误。我想知道是不是因为参数存储在函数堆栈中并且没有PointSet对象的有效空间(stackoverflow?lol)?但我认为关键字new不会在堆栈中分配空间。所以我很困惑,为什么会发生这个错误?谢谢!

1 个答案:

答案 0 :(得分:4)

不要在复制构造函数中释放(或读取)this->_Set - 它将在 unconstructed 实例上调用以构建它。您显示的代码适用于赋值运算符(以及this != &ps检查),它被调用以更改已构造对象的内容。正确的复制构造函数如下所示:

PointSet::PointSet(const PointSet& ps)
{
    Containment = ps.Size;
    _Set = new Point[Containment];
    Size = ps.Size;
    for (size_t i = 0; i != ps.Size; ++i)
        _Set[i] = ps._Set[i];
}

或者,更好的是,将原始指针/大小/包含成员替换为封装三者的标准容器,例如std::vector<Point>。然后,您的类的工作将是公开对您正在建模的域有意义的公共API。另一方面,使用std::vector将确保编译器(复制构造函数,析构函数和赋值运算符)自动生成的特殊成员函数是高效且正确的。