【请教】:VC6转VC2008出现的内存错误

tiger波波 2014-05-19 06:38:08
大家好,我现在要把别人用VC6做的的一个很复杂的项目迁移到VC2008上,修改了普通的错误后,程序运行时,发现了一个内存错误,经过跟踪发现原因是因为全局变量数据被修改造成的。

举个示意性的例子说明下:

VC2008
全局变量地址:0x101-0x162

程序循环修改从地址0x166开始的数据:
0x166-0x167 : 修改2个Byte
0x164-0x165 : 修改2个Byte
0x162-0x163 : 修改2个Byte 全局变量数据被破坏
0x160-0x161 : 修改2个Byte 全局变量数据被破坏

而VC6不出问题是因为VC6编译器分配的地址距离较远,如:

全局变量地址:0x121-0x182

程序循环修改从地址0x266开始的数据:
0x266-0x267 : 修改2个Byte
0x264-0x265 : 修改2个Byte
0x262-0x263 : 修改2个Byte
0x260-0x261 : 修改2个Byte

现象给我的感觉是VC2008分配的变量地址变紧凑了(可能不对)
请问,先不考虑修改代码的情况下,能不能通过设置VC2008编译选项,达到和VC6一样的效果???
...全文
134 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2014-05-22
  • 打赏
  • 举报
回复
BYTE qq; BYTE Data[200]; memcpy(&qq, Data,200); 这样的代码,在VC6里肯定也不能正确运行
tiger波波 2014-05-22
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
0x166 这样的地址很奇怪啊,怎么可能会访问到这么低的内存地址?
这是举的例子。 问题找到了,硬着头皮读代码,看懂作者意图后,发现确实是代码的问题。 为了好理解还是举例说明,实际代码不是这样。 BYTE qq; BYTE Data[200]; memcpy(&qq, Data,200); 编译器看作者的意思 是只用一个BYTE,所以,在qq后边的地址分配给其他数据,结果作者往里拷贝了200个字节,破坏了后边的数据。 谢谢大家了
tor_gate 2014-05-21
  • 打赏
  • 举报
回复
设置内存断点 看一下.
shen_wei 2014-05-21
  • 打赏
  • 举报
回复
找到关键代码 ,才是关键!IDE都是高版本兼容低版本的,何况你是VC6.0
wyx100 2014-05-20
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
我觉得你还是先Debug call stack,看函数调用堆栈,找到出错的函数先吧
worldy 2014-05-20
  • 打赏
  • 举报
回复
0x166 这样的地址很奇怪啊,怎么可能会访问到这么低的内存地址?
oyljerry 2014-05-20
  • 打赏
  • 举报
回复
引用 2 楼 youyingbo 的回复:
[quote=引用 1 楼 VisualEleven 的回复:] 我觉得你还是先Debug call stack,看函数调用堆栈,找到出错的函数先吧
谢谢。 我已经找到出错的函数了,跟踪出错函数代码得知1楼写的出错原因,但原因是表面现象,根本原因我分析有2个,1是编译器问题(可能性比较小),2是代码确实有问题。我现在想2方面同时排查,因此想请教下大家,能不能通过设置编译选项修正上述问题。[/quote] 你修改地址不能冲突全局变量的地址,要避开
叶恭介叶恭介 2014-05-20
  • 打赏
  • 举报
回复
个人感觉代码有问题多点,我也试过转VC6到VC10的,没发现过在编译选项会出问题.
tiger波波 2014-05-20
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
我觉得你还是先Debug call stack,看函数调用堆栈,找到出错的函数先吧
谢谢。 我已经找到出错的函数了,跟踪出错函数代码得知1楼写的出错原因,但原因是表面现象,根本原因我分析有2个,1是编译器问题(可能性比较小),2是代码确实有问题。我现在想2方面同时排查,因此想请教下大家,能不能通过设置编译选项修正上述问题。
worldy 2014-05-20
  • 打赏
  • 举报
回复
lz在V2008中,工程属性的字符集使用未设置试试,不要试图转为unicode,转uincode经常会出不少问题
zgl7903 2014-05-20
  • 打赏
  • 举报
回复
VS2008 默认的是 UNICODE 所以从VC6下转过来的, 一般字符串拷贝拷贝比较容易导致越界 用 _tcscpy_s _tcscat_s memcpy_s 替换原来的函数
Eleven 2014-05-19
  • 打赏
  • 举报
回复
我觉得你还是先Debug call stack,看函数调用堆栈,找到出错的函数先吧

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧