【问题标题】:Runtime error 0xC0000005 - access violation运行时错误 0xC0000005 - 访问冲突
【发布时间】:2015-03-10 10:34:02
【问题描述】:

我对 C++ 中的对象行为有一个有趣的问题。 我有这样的代码(它是简化的代码):

    class Example
    {
     public:
      void SetA(const int& na) {a = na;}
     private:
      int a;
    }
    class Example1
    {
     public:
      Example& GetExample() {return a;}
     private:
      Example a;
    }
    class Example2
    {
     public:
      Example1& GetExample1() {return a;}
     private:
      Example1 a;
    }

    template<
    class Object,
    class Setter = void(__thiscall Object::*)(const int&)>
    class ExampleSetter
    {
     public:
      ExampleSetter(Object& parameters, Setter setter):
       m_setter(setter), m_params(parameters)

      void ApplySet(int toSet)
      {   
       boost::bind(m_setter, boost::ref(m_value), toSet)();
      }
     private:
      Object& m_value;
      Setter m_setter;
    }

    int main()
    {
     // all Example%n% classes have proper constructors and properly initializes all fields
     Example2 example(...); 
     ExampleSetter<Example> setter(example.GetExample1().GetExample(), &Example::SetA);

     for(int i = 0; i < 10; i++)
     {
     example = Example2(...);
     setter.ApplySet(i);
     }
    }

调用赋值运算符时,我在 SetA 中遇到写入访问冲突。当我在发布模式下运行应用程序而不进行调试时,此错误随机出现(在 5-6 次迭代中),并且在我在发布模式下调试时始终出现在第 1 次迭代中。在调试模式下,错误消失 =)。所有 Example%n% 对象都在 .dll 和 ExampleSetter 中定义 - 在 .exe 中。所以我不知道为什么会这样。有人可以帮帮我吗?

更新: “示例”类有很多其他字段。这个错误是随机出现的,所以在其他 setter 的其他一些模拟调用正确完成后我得到了错误。

【问题讨论】:

  • 您的 dll 是在应用程序生命周期内持续存在还是被卸载了一段时间?
  • 你能提供一个MCVE吗?我们可以复制和粘贴的东西,例如ideone 或 coliru 并自己查看错误。或者,如果它在该环境中不可重现,至少可以为您重现错误并编译。您的代码遗漏了几个 ;,使用了未声明的标识符 (m_params) 等。关于“额外的字段” - 验证它在没有它们的情况下是否可重现。如果没有,将它们包含在问题中。
  • 由于这只是您的实际代码的模糊近似值,因此只能说您有未定义的行为,并且它是由某处的某事引起的。我的第一个猜测是您引用的对象已不复存在。

标签: c++ boost access-violation


【解决方案1】:

似乎变量的地址在分配后可能会改变(我只是在“example = Example2(...);”之前和之后记录 Example::a 的地址。它们可能不同)。问题已结束,非常感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2013-10-11
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多