这是内存 泄露吗?处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0012f280 处的 std::bad_alloc。

yanasdf789 2013-07-12 04:25:55
错误 :
“处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0012f280 处的 std::bad_alloc。”
* Put the new entry into the table and update the end-of-table
* pointer.
*/
*(onexitend++) = (_PVFV) EncodePointer(func);
__onexitend = (_PVFV *) EncodePointer(onexitend);

return func;

vector<CAA::pc>* CGetPointsCloud::MyGetRegPoints(int IMx,int IMy,int Ptdentity)
{
//*******获取文件名
char* m1="D:\\test2\\";
char* type=".dat";
char* fh="_";
char*path=NULL;
char temp[80];
_snprintf(temp,79,"%s%d%s%d%s%d%s",m1,Ptdentity,fh,IMx,fh,IMy,type);temp[79]=0;
path=(char *)temp;


vector<pc> *IPtCloud=new vector<pointcloud>;

FILE *RegFile=fopen(path,"rb+");
if(RegFile!=NULL)
{
fseek(RegFile,0,SEEK_END);
long flength=ftell(RegFile);
long Isize=sizeof(pointcloud);
int headsize=sizeof(head);
int ptlength=(flength-headsize)/Isize;

fseek(RegFile,headsize,0);
for(int k=0;k<ptlength;k++)
{
pointcloud Pttemp;
fread(&Pttemp,sizeof(pointcloud),1,RegFile);
IPtCloud->push_back(Pttemp);//错误********
}

fclose(RegFile);
}
return IPtCloud;
}

函数调用

vector<CAA::pc>* PointsResult=NULL;
CAA * m_GetPointsCloud=new CGetPointsCloud;
PointsResult=m_GetPointsCloud->MyGetRegPoints(Mx,My, PointDensity);
delete PointsResult;


第一次 调用没错 ,第二次调用就报这个错?这是什么问题?指针空间没有释放?还是内存不够?
...全文
2583 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wo252518553 2014-10-14
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
双击后进入到这个函数,是哪里出问题了呢? __forceinline void * __cdecl _heap_alloc (size_t size) { if (_crtheap == 0) { _FF_MSGBANNER(); /* write run-time error banner */ _NMSG_WRITE(_RT_CRT_NOTINIT); /* write message */ __crtExitProcess(255); /* normally _exit(255) */ } return HeapAlloc(_crtheap, 0, size ? size : 1); }
www_adintr_com 2013-07-15
  • 打赏
  • 举报
回复
引用 4 楼 yanasdf789 的回复:
[quote=引用 1 楼 adlay 的回复:] 看代码前我先猜是堆内存访问越界
如何解决?我读取一个非常大非常大的文件数据[/quote] 内存有限, 使用的时候要珍惜. 大文件用到哪部分对哪部分, 别一口气都读到内存里面撒.
我看你有戏 2013-07-15
  • 打赏
  • 举报
回复
基本上是指针操作的问题
FancyMouse 2013-07-15
  • 打赏
  • 举报
回复
数据本身大?上3G的话,换64位编译运行。
unituniverse2 2013-07-15
  • 打赏
  • 举报
回复
stl中的很多函数、成员函数(特别注意那些带有内存分配、重分配动作的函数),都是无失败返回的。不是表示这些函数一定会成功,而是这些函数是用主动抛异常的方法表示失败情况的。真正不会失败(不考虑使用者代码里引入的bug)的函数都是nothrow/noexcept标注的函数(或者文档已经明确表示没有错误的返回)。
unituniverse2 2013-07-15
  • 打赏
  • 举报
回复
bad_alloc异常不就是分配失败吗? std new分配阶段失败就抛出这个异常。 new的3种形式: nothrow new: 分配阶段失败,返回空指针;成功则在分配的内存上构造指定对象并返回对象指针。 std new:分配阶段失败,抛出bad_alloc异常;成功则在分配的内存上构造指定对象并返回对象指针。 placement new:调用时附带一个或更多个参数,在其返回地址上构造对象并最终返回对象指针给调用者。 stl一般都是用的std new。 new和delete是C++的内置语法。而重载的new和delete操作符可以看作是“底层分配函数”。 调用时用户实际上是用的new和delete语句。这个语句内部调用对应的new或delete操作符(所以用户重载的这些操作符实际上并不是用户写new和delete分配或释放时的语句,而是语句的内层函数)。new语句会先调用new操作符函数,然后在构造完对象后将分配的首地址解释成对象地址返回;delete语句则先析构对象,然后调用delete操作符函数,最后返回。
yanasdf789 2013-07-14
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
看代码前我先猜是堆内存访问越界
如何解决?我读取一个非常大非常大的文件数据
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
pc 和 pointcloud 这两个怎么定义的? 他们的 sizeof 大小是一样的么? 如果 sizeof(pc) > sizeof(pointcloud) 那么就有可能会出现堆内存访问越界.
赵4老师 2013-07-12
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
看代码前我先猜是堆内存访问越界

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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