C++;指针使用Visual Studio更改地址,而不是OsX中的Xcode或Linux中的gcc 我有一个C++问题,困扰我的头脑已经好几个小时了:我有一个类,它包含我需要做指针引用的项目的地图;在Osx和Linux下一切正常,但在Windows下运行我用MSVC构建的程序时,似乎地图中项目的地址以及地图的基址都会发生变化,这取决于使用它的类的函数,所以我的指针指向了它们不应该指向的东西;有人知道一些晦涩难懂的编译器选项可以做这样的事情吗 class Base { std::map <uint64_t, long> items ; ... void functA() { std::cout << "FunctA: " << &items ; } void functB() { std::cout << "FunctB: " << &items ; } }

C++;指针使用Visual Studio更改地址,而不是OsX中的Xcode或Linux中的gcc 我有一个C++问题,困扰我的头脑已经好几个小时了:我有一个类,它包含我需要做指针引用的项目的地图;在Osx和Linux下一切正常,但在Windows下运行我用MSVC构建的程序时,似乎地图中项目的地址以及地图的基址都会发生变化,这取决于使用它的类的函数,所以我的指针指向了它们不应该指向的东西;有人知道一些晦涩难懂的编译器选项可以做这样的事情吗 class Base { std::map <uint64_t, long> items ; ... void functA() { std::cout << "FunctA: " << &items ; } void functB() { std::cout << "FunctB: " << &items ; } },c++,linux,windows,macos,pointers,C++,Linux,Windows,Macos,Pointers,调用functA和functB的输出可能是,例如: Linux/OsX 函数:013FF7A0 FunctB:013FF7A0 窗口: FunctA:013FF900 FunctB:013FF7A0 我也尝试指向迭代器,但是他们做了同样的事情,我从C++文档中理解到,对于映射元素有固定的地址,它们只针对删除的项目进行更改。 问题非常微妙,但我已经找到了解决方案。事实是,显然GCC和XCode编译器创建了一个隐式的新对象,而MSVC没有这样做,因此对象没有分配到免费存储中,这在Windows下搞得

调用functA和functB的输出可能是,例如:

Linux/OsX 函数:013FF7A0 FunctB:013FF7A0

窗口: FunctA:013FF900 FunctB:013FF7A0


我也尝试指向迭代器,但是他们做了同样的事情,我从C++文档中理解到,对于映射元素有固定的地址,它们只针对删除的项目进行更改。

问题非常微妙,但我已经找到了解决方案。事实是,显然GCC和XCode编译器创建了一个隐式的新对象,而MSVC没有这样做,因此对象没有分配到免费存储中,这在Windows下搞得一团糟,通过将源代码更改为以下内容,一切都变好了:

 class Base {
   std::map <uint64_t, long> items ;

   ...

   void functA() {
      std::cout << "FunctA: " << &items ;
   }

   void functB() {
      std::cout << "FunctB: " << &items ;
   }
}

...

void main() {
      Base* a ;
      a = new Base() ;
      ...
      a.functA() ;
      a.functB() ;
   }
类基{
地图项目;
...
无效函数(){

std::cout这个问题没有意义。
functA
functB
都是成员函数,所以你不能只是“调用”它们。你需要一个调用它们的对象。是的,你是对的,我省略了部分代码;我创建了一个“基”对象,然后调用函数您的问题出在未显示的代码中。您发布的代码是虚构的。没有
Main
(应该是
Main
)。请从编辑器中粘贴用于创建问题的确切代码。此外,如果您在unix上,请尝试运行valgrind以查看是否有任何内存错误。但是,问题在于您没有显示的代码。
 class Base {
   std::map <uint64_t, long> items ;

   ...

   void functA() {
      std::cout << "FunctA: " << &items ;
   }

   void functB() {
      std::cout << "FunctB: " << &items ;
   }
}

...

void main() {
      Base* a ;
      a = new Base() ;
      ...
      a.functA() ;
      a.functB() ;
   }