此文仅以记载自己编程犯下的傻B错误,记录调试过程。
问题1:
将VC6.0编译通过的代码复制到VS2010中,出现以下错误:
error C2440: “=”: 无法从“char [9]”转换为“LPCWSTR”
IntelliSense: 不能将 "char *" 类型的值分配到 "LPCWSTR" 类型的实体:
解决1:
1、工程使用了UNICODE字符集,把你的 "字符串" 包含的字符串修改为 _T("字符串") 。
2、不使用UNICODE字符集即可。操作:项目->XX属性->配置属性->常规->项目默认值->unicode中的字符值改为未设置
问题2:
在dialog中添加了radio button控件,但在VS2010中的类向导中找不到控件ID,因此无法添加关联的变量
解决2:
将radio button的属性组中的group选为true,即可。
问题3:
无效的堆指针。错误如图:
由Expression:_CrtIsValidHeapPointer(pUserData)可知,由于出现了无效的堆指针。
概念:
1、栈区(stack)——— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,地址是由高向低减少的。
2、堆区(heap) ——— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。是由malloc之类函数分配的空间所在地。地址是由低向高增长的。
3、全局区(静态区)(static)——— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 ——— 常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区 ——— 存放函数体的二进制代码。
导致如上问题,应该是由malloc、free导致内存分配、释放导致的错误。常见如下:
1、malloc与free配套使用。不要跨进程分配和释放;
2、指向malloc申请的堆内存的指针,在运用过程中千万不要另外赋值,否则同样导致内存泄露
3、malloc后,实际使用时指针长度超过了你申请的范围。再去free时肯定出问题。
4、改变指针的初始指向地址。
解决3:
调整free(pointer)的位置,设置断点调试。直到找出导致错误的具体位置,在具体分析。(我的问题是第3条:超出实际申请内存范围所导致的错误)。
问题4:
错误莫名奇妙。症结如下:
1、头文件中,定义的类class A{ } ; 末尾的分号没加。
2、头文件嵌套的问题:
//----A.H----//
#pragma once
#include "b.h"
class A
{
public :
B m_b;
};
//----B.H----//
#pragma once
#include "a.h"
class B
{
public :
A m_a;
};
在A类中,定义了B类的成员变量,同样,在B类中,定义了A类的成员变量。以上头文件嵌套方法将出现问题。
解决4:
在类前加上类的申明即可。
//----A.H----//
#pragma once
class B;
class A
{
public :
B m_b;
};
//----B.H----//
#pragma once
#include "a.h" //此处也可为: class A;
class B
{
public :
A m_a;
};