相关代码如下:
//文件打开操作
void CFileView::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码
CFileDialog m_fileDlg(TRUE);
m_fileDlg.m_ofn.lpstrTitle="打开文件";
m_fileDlg.m_ofn.lpstrFilter="text file(*.txt)\0*.txt\0all file(*.*)\0*.*\0\0";
m_fileDlg.m_ofn.lpstrDefExt="txt";
if(IDOK==m_fileDlg.DoModal())
{
CFile m_file2(m_fileDlg.GetFileName(),CFile::modeRead  );
char* buf=NULL;
int len=m_file2.GetLength();
buf=new char(len+1);
m_file2.Read(buf,len+1);
buf[len]=0;
MessageBox(buf);
m_file2.Close();

delete buf;

}
}在文件对话框中选择文件,并按下确定按钮后出现如下提示:
错误提示:
      Windows 已在 File.exe 中触发一个断点。      其原因可能是堆被损坏,这说明 File.exe 中或它所加载的任何 DLL 中有 Bug。      原因也可能是用户在 File.exe 具有焦点时按下了 F12。      输出窗口可能提供了更多诊断信息。不知道这是什么原因,希望大家不吝赐教.错误截图:
mfc

解决方案 »

  1.   

    你打开文件时用的是GetFileName,这个只返回文件名,不返回文件完整的路径,所以文件没有打开,应该用GetPathName
    另外,会不会是打开的文件太大了,new char 申请不了那么大的空间。还有,既然len已经是文件的大小了,你Read的时候大小却是len+1
      

  2.   

        谢谢您的帮助
        因为我要打开的文件在源文件目录下,所以我认为GetFileName应该可以用吧,至于文件太大的原因,我也试了一下,大的文件确实打不开,直接就弹出错误提示,而小文件可以打开,在关闭MessageBox后弹出错误提示,还有就是len的问题,我确定了一下,也不是它的问题。
        另外,我单步调试了一下,发现错误的弹出是在程序执行最后一句即“delete buf”的时候出现的,所以我怀疑是不是new和delete的使用出现了问题?
      

  3.   


    new char[]不是new char()
      

  4.   

    m_file2.Read(buf,len+1);//比文件 多了 1! 不要
      

  5.   

        非常感谢大家的帮助
        问题解决了,网友baoyuan2013最后的回答道出了问题的所在。非常感谢!
        new和delete是c++的运算符,new后面加方括号的意义和加圆括号的意义不同,加“ [ ]”应该是为C++内部数据分配动态空间或是分配类对象数组的动态空间,加“( )”应该是为c++初始化动态分配的类对象而用。