C++ C++;复制构造函数0xC0000005:访问冲突写入错误
这是代码。这是一个在R^2空间中存储点的类C++ C++;复制构造函数0xC0000005:访问冲突写入错误,c++,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
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];
}
}
PointSet::PointSet(常量PointSet&ps)
{
if(安全壳
将PointSet对象传递给函数的参数时发生0xC0000005:访问冲突写入错误。我想知道这是否是因为参数存储在函数堆栈中,而PointSet对象没有有效的空间(stackoverflow?lol)?但我认为关键字new不会在堆栈中分配空间。所以我很困惑,为什么会发生这种错误?谢谢 不要在复制构造函数中取消分配(或读取)此->\u集
-将在未构造的实例上调用它以构造它。您显示的代码适用于赋值运算符(以及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
。然后,类的工作将是公开对正在建模的域有意义的公共API。另一方面,使用std::vector
将确保编译器自动生成的特殊成员函数(复制构造函数、析构函数和赋值运算符)高效且正确。哦,我明白了。谢谢。但是如果我想将一个点集实例复制到另一个点集实例呢?我必须覆盖=运算符吗?@ColdiceRayEsedra是的,当您自定义析构函数时,几乎肯定要自定义复制构造函数和赋值运算符(查找“三个规则”)。@ColdiceRayEsedra而且,如果您使用std::vector
成员实现PointSet
,自动生成的析构函数、赋值和复制构造函数可以正常工作。(并且您将在C++11下自动获得移动构造函数和移动赋值。)以双下划线\uuuuu
开头或以下划线和大写字母\ux
开头的标识符是。因此,\u Set
是一个无效的名称。你应该重构你的代码。对不起,你到底想实现什么?如果您正在学习如何编写自己的向量类,为什么不使用通用解决方案呢?你为什么使用原始指针而不是智能指针?如果这是一个真实项目中的类,为什么不坚持使用标准的vector类呢?我试图更改为使用vector类,但仍然导致堆栈溢出。请针对您遇到的新问题提出单独的问题。另外,要考虑到问题可能在代码的一个不相关的区域。创建一个经常被证明在提出问题之前解决它的过程很有帮助。@user4815162342我想问另一个单独的问题,但我不能,因为系统说我可以在两天后再问一个问题。