C++ 在方法激活时具有两个不同实例的对象

C++ 在方法激活时具有两个不同实例的对象,c++,visual-studio-2010,debugging,C++,Visual Studio 2010,Debugging,标题不是很清楚,如果有人有更好的建议,请告诉我。 现在谈正事: 我正在激活一个类的方法 m_someObject.Clear(); 问题是,当我在调用之前查看m_someObject的地址时,我发现它位于某个地址,而当我使用调试器输入Clear方法时,我发现这个变量位于另一个地址。 结果是,从Clear方法返回后,它似乎没有影响 m_someObject调用它的实例。 有人知道是什么导致了这种行为吗? 使用Microsoft Visual Studio 2010 64位。您可能会将m_some

标题不是很清楚,如果有人有更好的建议,请告诉我。 现在谈正事: 我正在激活一个类的方法

m_someObject.Clear();
问题是,当我在调用之前查看
m_someObject
的地址时,我发现它位于某个地址,而当我使用调试器输入
Clear
方法时,我发现
这个
变量位于另一个地址。 结果是,从
Clear
方法返回后,它似乎没有影响
m_someObject
调用它的实例。 有人知道是什么导致了这种行为吗?
使用Microsoft Visual Studio 2010 64位。

您可能会将
m_someObject
作为值传递给其他函数(从而获得副本),并仅在副本上执行
Clear()
。这样您就不会注意到原始对象上的更改。

您能检查一下是否有两个同名的不同变量吗?一个是在立即作用域中定义的,另一个是在全局作用域中定义的?

很显然,调试器在撒谎。。我不知道这一点,但显然有些代码是在发布模式下编译的。结论-调试器否,printf-是。

最常见的原因是多重继承。与C++和java不同,C++中的类可以有多个基类。显然,并不是所有对象都可以位于偏移量0处。这意味着,如果您使用的基类的方法位于非零偏移量,则必须调整

您有Java或C背景吗?我猜您可能是通过值将m_someObject传递给函数,对于相同的语法,在C#和Java中有不同的语义。我将逐步使用调试器,在输入(和退出)Clear方法m#u someObject之前(和之后)有一个地址,在该方法中它有另一个地址。您的代码和这个代码段之间有什么区别?这不仅仅是这两种情况下打印相同地址的代码,我的也不是。。。