【问题标题】:C++ Write access violation [duplicate]C ++写访问冲突[重复]
【发布时间】:2021-02-16 14:35:41
【问题描述】:

所以我正在编写一个 c++ OpenGl 应用程序,它应该测试两个匹配的数字是否相同。我写了一个自己的类:“figure”类。此类使用“线”和“点”两个类。在这里你可以在 figure.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, int y, 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++ 还不熟练,所以我现在真的不知道如何解决这些错误

【问题讨论】:

  • 我怀疑错误出现在未显示的代码中。您能给我们提供足够的代码来复制错误并确认仅使用您提供的代码即可复制错误吗?
  • #define SHINT short int 请不要。使用内置类型的标准名称。还建议改用固定大小的整数。
  • @DavidSchwartz 通过断点将错误缩小到两个函数:Addline() 和 SetWorking()
  • 在构建 Stack Overflow 示例时,请从 minimal reproducible example 获取灵感。它不仅会为我们提供帮助您所需的所有信息,而且还是一种强大的调试技术。在将您的代码筛选到 MRE 时,您会发现并自己修复错误的可能性非常大。
  • @onefriendlyprogrammer 然后给我们只包含复制错误的那些函数的代码。如果您将其缩小到这些功能,那应该很容易。但我怀疑你会发现你需要更多的代码才能做到这一点。 (最有可能的是,这两个函数是 victim 而 bug 在其他地方。)

标签: c++ access-violation


【解决方案1】:

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

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

我怀疑selected 是一个空指针,p1 的赋值导致访问冲突。

【讨论】:

  • @MornigDewd 听起来非常合理。我目前正在工作,无法尝试解决此问题,但我认为您的猜测是正确的。没有想到这样的事情,但它是完全有道理的!太感谢了!我稍后会尝试解决这个问题,然后关闭这个线程!非常感谢!
猜你喜欢
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多