debug堆已损坏

August_1997 2017-07-23 07:23:43
大一暑假学校的一个小作业,要求是用刚学的MFC CFile类做一个登录框,在实现注册功能对文本进行读写的时候报了错 搞了半天没能解决
贴代码

void CRegister::OnBnClickedBtnRegisterConfirm()
{
UpdateData(TRUE); //得到编辑框的值

//字符串的转换
USES_CONVERSION; //提前声明宏

//将编辑框值进行拷贝
CUser reg_info;
strcpy_s(reg_info.name, sizeof(reg_info.name), T2A(m_edt_ReUsername));
strcpy_s(reg_info.pwd, sizeof(reg_info.pwd), T2A(m_edt_RePassword));

int nFlag = 0; //为0时注册成功,非0时注册失败,其中为1时用户名重复,为2时两次密码输入不一致

//读用户信息文本
CFile file;
//CUser* userinfo = new CUser; //创建对象指针便于文件读出
file.Open(_T("Usersinfo.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareExclusive);

int i = 0; //索引变量
int nSize = file.GetLength(); //文件大小
while (file.GetPosition() <= nSize && nFlag == 0) //判断文件指针的位置是否到文件末尾 且 文件尚未重名
{
//读出信息
file.Read(&userinfo[i], sizeof(CUser));
file.Seek(sizeof(CUser)*(i+1), CFile::begin); //移动文件指针位置

//信息处理
if (strcmp(reg_info.name, userinfo[i].name) == 0) //判断注册用户名是否重名
{
nFlag = 1; //文件重名标识符
}
i++;
}

//判断两次密码输入是否不一致
if (reg_info.pwd != m_edt_PswdConfirm)
{
if (nFlag == 1) //判断用户名是否重复
{
nFlag = 3;
}
else
{
nFlag = 2;
}
}

switch (nFlag)
{
case 0: //注册成功,写入信息
file.SeekToEnd();//将文件指针移动至文件末尾
file.Write(®_info, sizeof(CUser)); //写入新用户
MessageBox(_T("注册成功!"));
break;
case 1: //用户名重复
MessageBox(_T("错误信息1:\n\t用户名重复!"));
break;
case 2: //两次输入密码不一致
MessageBox(_T("错误信息2:\n\t两次密码输入不一致!"));
break;
case 3: //两次密码输入不一致且用户名重复
MessageBox(_T("错误信息3:\n\t用户名重复!\n\t两次密码输入不一致!"));
break;
default: //其他
MessageBox(_T("未知错误!"));
}

//关闭文件
file.Close();
}

debug在messagebox之后会出现堆已损坏的errorr,好像是越界了但不知道怎么修改
...全文
207 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-24
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}

16,472

社区成员

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

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

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