这是代码。这是一个在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不会在堆栈中分配空间。所以我很困惑,为什么会发生这个错误?谢谢!
答案 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
将确保编译器(复制构造函数,析构函数和赋值运算符)自动生成的特殊成员函数是高效且正确的。