Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;复制构造函数0xC0000005:访问冲突写入错误_C++ - Fatal编程技术网

C++ C++;复制构造函数0xC0000005:访问冲突写入错误

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

这是代码。这是一个在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];
    }
}
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我想问另一个单独的问题,但我不能,因为系统说我可以在两天后再问一个问题。