c++-VS调试发现内存错位,赋值失败

问题描述

VS调试发现内存错位,赋值失败

大家好,我写的一个C++程序在一个类里面发生内存错乱,主要现象是:
1.对类的变量赋值不生效
2.调试时反汇编发现该变量的地址与调试时看到的地址不同,导致汇编代码所指的地址与调试时看到的地址有出入

如果将这个类抽取出来,新建一个工程写成一个demo程序,则这个类是工作正常的,同时两个工程的工程配置一样。
大家有遇到过类似的情况吗?找了好几天了,不知道原因在哪里……
请高手指点,谢谢了

解决方案

可能是调试符号和程序不对应,你删除了所有生成的文件,重新编译下看看。

解决方案二:

补充一下。通过调试,对比两个工程的反汇编代码发现,类里面的同一个变量其相对类的this指针的偏移量不同,因此在有问题的工程里面赋值不成功,将值赋去其他内存块了,因此在VC调试时的现象是一直赋值不成功。

解决方案三:

在VC上对比了工作正常和不正常两个工程的同一段汇编代码,发现两者同一个变量的地址相对this指针的偏移量不同,从而导致有问题的那个工程赋值失败,如下:

工作不正常的:
EncodeSW():m_h264Buf(NULL), m_yuvBuf(NULL),m_pCodecContext(NULL),m_width(0),m_height(0)
{

000000013F429730 mov qword ptr [rsp+8],rcx

000000013F429735 push rdi

000000013F429736 mov rax,qword ptr [this]

000000013F42973B mov qword ptr [rax],0

000000013F429742 xor eax,eax

000000013F429744 mov rcx,qword ptr [this]

000000013F429749 mov word ptr [rcx+7Dh],ax

000000013F42974D xor eax,eax

000000013F42974F mov rcx,qword ptr [this]

000000013F429754 mov word ptr [rcx+7Fh],ax

000000013F429758 mov rax,qword ptr [this]

000000013F42975D mov qword ptr [rax+81h],0

000000013F429768 mov rax,qword ptr [this]

000000013F42976D mov qword ptr [rax+89h],0

m_yuvBuf = NULL;
000000013F429778 mov rax,qword ptr [this]

000000013F42977D mov qword ptr [rax+89h],0 //偏移量89h,不正常
}

工作正常的:
EncodeSW():m_h264Buf(NULL), m_yuvBuf(NULL),m_pCodecContext(NULL),m_width(0),m_height(0)
{

000000013F692620 mov qword ptr [rsp+8],rcx

000000013F692625 push rdi

000000013F692626 mov rax,qword ptr [this]

000000013F69262B mov qword ptr [rax],0

000000013F692632 xor eax,eax

000000013F692634 mov rcx,qword ptr [this]

000000013F692639 mov word ptr [rcx+82h],ax

000000013F692640 xor eax,eax

000000013F692642 mov rcx,qword ptr [this]

000000013F692647 mov word ptr [rcx+84h],ax

000000013F69264E mov rax,qword ptr [this]

000000013F692653 mov qword ptr [rax+88h],0

000000013F69265E mov rax,qword ptr [this]

000000013F692663 mov qword ptr [rax+90h],0

m_yuvBuf = NULL;
000000013F69266E mov rax,qword ptr [this]

000000013F692673 mov qword ptr [rax+90h],0 //偏移量90h,正常
}

解决方案四:

你的同一个类是不是有两个不同的定义,然后你的两个不同 cpp 分别使用了这两个不同的定义 ....

时间: 2024-09-20 12:35:47

c++-VS调试发现内存错位,赋值失败的相关文章

使用DrMemory发现内存编程错误

Dr Memory 简介 Dr. Memory 是一个开源免 费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问.内存非法访 问以及内存泄露等.它不仅能够在 Linux    下面工作,也能在微软的 Windows 操作系统上工作.不过,本文撰写时,DrMemory 仅能支持 32 位程序,这是它的一个巨大缺 陷,但相信随着开发的进行,DrMemory 会推出支持 64 位程序的版本. Dr Memory 与 Valgrind 类似,可以直接检查已经编译好的可执行文件.用户不用

jdbc-sql语句中的?赋值失败??求大家帮忙找找原因,在下感激不尽

问题描述 sql语句中的?赋值失败??求大家帮忙找找原因,在下感激不尽 private Connection conn = null; private PreparedStatement pstmt = null; private ResultSet rs = null; public List supplierfindbyname(Supplierlocation su) { // TODO Auto-generated method stub List sulist = new ArrayL

heap-org.apache.coyote.RequestInfo无法回收,发现内存中存在大量实例

问题描述 org.apache.coyote.RequestInfo无法回收,发现内存中存在大量实例 最近tomat内存一直上升下不来.把heap下下来用memory analyzer看一下,发现大量的org.apache.coyote.RequestInfo实例没有被回收, 请问一下这是不是说tomcat有BUG还是没有配置好? 解决方案 http://www.xuebuyuan.com/2174796.html

c语言-迷宫问题出现死循环,经调试发现似乎为结构体中数据无法改变,又或者其他语句导致?

问题描述 迷宫问题出现死循环,经调试发现似乎为结构体中数据无法改变,又或者其他语句导致? #include #include typedef struct//定义栈元素结构类型 { int x; int y; int direction; }data; typedef struct//定义栈 { data *base; data *top; int stacksize; }sqstack; int initstack(sqstack &s)//建立栈 { printf("please i

MAP430F5438 程序调试 Flash内存存储问题

问题描述 MAP430F5438 程序调试 Flash内存存储问题 如图地址796A0X处存着 1800 7000 这是什么情况?有没有人可以解释一下? 解决方案 http://wenku.baidu.com/link?url=k7uBRtCKygEKN-WUscYmLoSvGzPU5-qjgCaKz81ju9KkUnVDXDV7_7gLhUI2hUByFcs5thaDHbWUZr2R9uhHyZqFFYSfB7LGYcw-DVpEtlO

新手求助,,!!!winform程序调试老是 sa用户登陆失败!!!咋回事

问题描述 我的机子xpsp2我调试的winform程序是c#2.0+sql2000第一步调试用户登陆时提示:用户"sa"登陆失败详细信息:有关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾.**************异常文本**************System.Data.SqlClient.SqlException:用户'sa'登录失败.在System.Data.SqlClient.SqlInternalConnection.OnError(SqlExcept

程序调试—发现及处理错误

程序|错误     读完上面内容,读者一定很想创建一个没有错误的ASP网页.但你可能会发现网页并不能工作.怎么办,只有进行测试. 在这一部分,首先简要看一下能使调试更容易的一些工具.Microsoft Script Debugger试图把调试支持工具提高到像Visual Basic.Delphi和Visual C++等大多数传统编程环境的水平.然而,下面将首先讨论一些更传统的有助于跟踪出现在网页中的错误的技术.7.5.1 常规调试技术       在第2章中,已经看到如何使用Response.W

WCF 内存入口检查失败 Memory gates checking failed

        在做JC系统时,出现这样的错误:                          英文报错:Memory gates checking failed because the free memory ({0} bytes) is less than {5}% of total memory. As a result, the service will not be available for incoming requests. To resolve this, either r

关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法

在通过url地址接受参数的时候,有些参数的值V带有回车' %0A ',这时候在页面脚本显示的时候,把这个值V付给脚本变量,可能会造成脚本的错误. 所以,相应的:一开始在传值的时候对一些字符串进行url编码,在脚本赋值的时候再进行url解码,这样就可以避免上面的问题. 在PHP中,对URL编码的操作函数是:urlencode() 和 urldecode() 对应在js中的URL编码操作函数是:encodeURI() 和 decodeURI()