我对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的其他类似调用正确完成后,我收到错误。
答案 0 :(得分:0)
似乎变量的地址在分配后可能会发生变化(我只是在“example = Example2(...);”之后记录Example :: a的地址。之后。它们可以不同)。问题已经结束,非常感谢。