微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++写访问冲突

如何解决C ++写访问冲突

因此,我正在编写一个c ++ OpenGl应用程序,该应用程序应测试两个以匹配方式布置的图形是否相同。我写了一个自己的课:“图”课。该类使用“线”和“点”这两个类。在这里,您可以在fig.h标头中看到我的实现:

#define SHINT short int

class Point
{
public:
    std::pair<SHINT,SHINT> coord;
    Point()
    {
        coord = std::pair<SHINT,SHINT>{ 0,0 };
    }
    Point(int x,int y)
    {
        coord = std::pair<SHINT,SHINT>{ (short)x,(short)y };
    };
};

class Line
{
public:
    std::pair<Point,Point> pts;
    Line()
    {
        pts = std::pair<Point,Point>{ Point(),Point() };
    }
    Line(Point p1,Point p2)
    {
        pts = std::pair<Point,Point>{ (Point)p1,(Point)p2 };
    };
};

class figure
{
public:
    figure() {};

private:
    std::vector<Line> lines;
    Point p1;
    Point p2;
    char* renderPath = FILEPATH;
public:
    void DrawComponents();
    void Clear();
    void RemoveLine(int index);
    void AddLine();
    void SetWorking(int x,int y,bool segment); //true seg1,false seg2
    
    void Render();
    
};

有问题的功能的实现如下:


void figure::AddLine()
{
    Line l1 = Line(p1,p2);
    lines.push_back(l1);
}


void figure::SetWorking(int x,bool segment)
{
    if (segment)
    {
        p1 = Point(x,y);
    }
    p2 = Point(x,y);
}

我有一个无花果*,可以将其设置为第一个图形或第二个图形。您可以借助ImGui叠加层完成此操作。如果按下鼠标按钮,则会触发一组功能

selected->SetWorking(posX,posY,m_Select);     //         
                                                            
            if (m_Select)                                   
                selected->AddLine();
相对于鼠标位置计算

posX和posY,它们工作正常。 然后,我们在图形指针上调用SetWorking()函数,该函数再次在Point中调用构造函数,并将工作点设置为posX和Y。我必须轮流使用。因此,如果我第一次单击,则设置第一个点,如果我单击第二次,则设置第二个点,并设置两个点,然后将新线推入向量中。通过SetWorking()函数中的“段”布尔实现此更改。点被保存为具有短整数的std :: pairs ,而线被保存为具有两个点的std :: pairs 。但是,如果我们到达那里,则会发生错误:“抛出了异常:写访问冲突。 这是0x14“ 在C ++ STL的实用程序文件中引发了错误:(第292行)

pair& operator=(_Identity_t<_Myself&&> _Right) noexcept(
        conjunction_v<is_nothrow_move_assignable<_Ty1>,is_nothrow_move_assignable<_Ty2>>) /* strengthened */ {
        first  = _STD forward<_Ty1>(_Right.first); // <---- here 
        second = _STD forward<_Ty2>(_Right.second);
        return *this;
    }

说实话,到目前为止,我对那里发生的事情一无所知。我的有根据的猜测是,std :: pair出错了,但是我还不熟悉c ++,所以我现在真的不怎么解决这类错误

解决方法

“这是0x14”:错误在pair的成员函数(operator =())中发生。执行operator =()的对对象的this指针的值为0x14,极不可能是正确的。

通常,这意味着该对是该指针== nullptr的对象的成员,并且该对对象相对于该类位于偏移量0x14处。

我怀疑selected是一个空指针,分配p1会导致访问冲突。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。