如何解决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 举报,一经查实,本站将立刻删除。