运行时错误0xC0000005 - 访问冲突

时间:2015-03-10 10:34:02

标签: c++ boost access-violation

我对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中写入访问冲突。当我在Release模式下运行应用程序而没有调试时,这个错误随机出现(5-6次迭代),并且当我在Release模式下调试时总是出现在第一次迭代中。在调试模式下,错误消失=)。所有示例%n%对象都在.dll和ExampleSetter中定义 - 在.exe中。所以我不知道为什么会这样。有人可以帮帮我吗?

UPD:  类“示例”还有很多其他字段。此错误随机出现,因此在其他setter的其他类似调用正确完成后,我收到错误。

1 个答案:

答案 0 :(得分:0)

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