问题描述
- 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 分别使用了这两个不同的定义 ....