我在C中编写了一个win服务器应用程序。我必须将它编译成.dll,而在32位机器上编译为32位.dll,它可以很好地工作。但是,当我使用cmake工具编译为64位并将相同的代码放在64位机器中并指定它为64位编译时,我运行该程序时,它会在释放一些内存的行上崩溃。
我的问题是:导致这种情况的原因是什么?为什么编码完全相同的程序在64位机器上的64位版本的内存中崩溃,而在32位机器上不是32位版本?是赢得32位服务器和赢得64位服务器有什么区别。请帮助我在两种类型的Windows操作系统中获得内存结构的差异。
版本信息:我正在使用Visual Studio 2010,赢得2008 R2
答案 0 :(得分:1)
是什么原因引起的?为什么程序编码完全相同,在64位机器上的64位版本的内存中崩溃,而在32位机器上不是32位版本?
因为您的代码不正确。它偶然可以在32位上运行,但是使用不同的指针大小编译64位,会暴露代码中的错误。
win 32位服务器和赢得64位服务器有什么区别吗?请帮助我在两种类型的Windows OS中获得内存结构的差异。
主要区别在于指针在32位上为32位宽,在64位上为64位宽。显然还有许多其他差异,但从您的角度来看,它的指针大小很重要。
端口从32位到64位发现的最常见的错误是指针截断。假设你有代码向ints投射指针。
int i = (int) p;
当编译为32位时,这恰好在运行时工作,但在64位上,你失去了一半的指针。当你以后转回指针
int* p = (int*) i;
你没有获得与你开始时相同的指针。从根本上说,问题是代码假设int
(在Windows上为4字节宽)与指针大小相同。该假设适用于32位,但不适用于64位。
你可能会遇到这个问题,而且很可能是其他更微妙的问题。为了解决这个问题,您需要详细调试该过程。
我认为您正在寻找一些简单的开关,以使您的程序正常运行。没有神奇的解决方案,因为问题在于您的代码。因此需要仔细调试。