C++ delete导致程序崩溃的问题

我的一个仙女朋友 2017-12-01 07:06:15
问题的经过就是首先在主函数中申请了一个double数组。

然后定义了一个函数,并将这个函数以函数指针的形式传递给一个类,在那个类中调用了这个函数。
在这个函数中就用到了之前申请的double数组。函数如下:
void update(double* x,int numFeature,int numData,double* const data){
for(int i=0;i<numData;i++){
for(int j=0;j<numFeature;j++){
x[j]=x[j]+data[i*numFeature+j];
}
}
}

运行到最后就delete了,但是运行到delete的时候就崩溃了。

程序是MPI程序。运行就会报以下错误:
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 10876 RUNNING AT node4
= EXIT CODE: 11
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
[proxy:0:0@node0] HYD_pmcd_pmip_control_cmd_cb (pm/pmiserv/pmip_cb.c:885): assert (!closed) failed
[proxy:0:0@node0] HYDT_dmxu_poll_wait_for_event (tools/demux/demux_poll.c:76): callback returned error status
[proxy:0:0@node0] main (pm/pmiserv/pmip.c:206): demux engine error waiting for event
[mpiexec@node0] HYDT_bscu_wait_for_completion (tools/bootstrap/utils/bscu_wait.c:76): one of the processes terminated badly; aborting
[mpiexec@node0] HYDT_bsci_wait_for_completion (tools/bootstrap/src/bsci_wait.c:23): launcher returned error waiting for completion
[mpiexec@node0] HYD_pmci_wait_for_completion (pm/pmiserv/pmiserv_pmci.c:218): launcher returned error waiting for completion
[mpiexec@node0] main (ui/mpich/mpiexec.c:344): process manager error waiting for completion

经过各种尝试,发现问题就出在update函数中。

神奇的地方在于,把函数改成这样就一切正常:
void update(double* x,int numFeature,int numData,double* const data){
for(int i=0;i<numData;i++){
for(int j=0;j<numFeature;j++){
double temp=data[i*numFeature+j];
x[j]+=temp;
}
}
}

把这个语句注释掉也不会报错:
void update(double* x,int numFeature,int numData,double* const data){
for(int i=0;i<numData;i++){
for(int j=0;j<numFeature;j++){
//x[j]+=data[i*numFeature+j];
}
}
}

改成这样也不会报错!
void update(double* x,int numFeature,int numData,double* const data){
for(int i=0;i<numData;i++){
for(int j=0;j<numFeature;j++){
x[j]=data[i*numFeature+j];
}
}
}

觉得好奇怪啊!匪夷所思!也没有越界,也没有修改过指针。求指点!
...全文
3583 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-03
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
真相重于对错 2017-12-03
  • 打赏
  • 举报
回复
我觉得很多的时候,把问题描述清楚了,答案自然就出现了 描述不清楚,往往是自己头脑混乱,那样怎么想得到答案?
真相重于对错 2017-12-03
  • 打赏
  • 举报
回复
1、怎么调用哪个函数的? 2、你一直在说delete,到底delete什么? 只给中间一段代码,无法判断
  • 打赏
  • 举报
回复
引用 14 楼 hdt 的回复:
[quote=引用 13 楼 u012197668 的回复:] [quote=引用 11 楼 hdt 的回复:] 我觉得很多的时候,把问题描述清楚了,答案自然就出现了 描述不清楚,往往是自己头脑混乱,那样怎么想得到答案?
data在主函数里new的。 然后在一个类中定义了一个double指针,把data赋值给类里面的double指针dataset,最后在类中调用这个函数,参数就是类中的double指针dataset。 最后在主函数里面delete data,然后就崩溃了。[/qute] 那个类的析构函数里面如何处理dataset???[/quote] dataset=nullptr; 这样的。。
www_adintr_com 2017-12-03
  • 打赏
  • 举报
回复
那也有可能是和现在这段代码无关的地方访问越界了, 然后在这个地方爆发出来
真相重于对错 2017-12-03
  • 打赏
  • 举报
回复
引用 13 楼 u012197668 的回复:
[quote=引用 11 楼 hdt 的回复:] 我觉得很多的时候,把问题描述清楚了,答案自然就出现了 描述不清楚,往往是自己头脑混乱,那样怎么想得到答案?
data在主函数里new的。 然后在一个类中定义了一个double指针,把data赋值给类里面的double指针dataset,最后在类中调用这个函数,参数就是类中的double指针dataset。 最后在主函数里面delete data,然后就崩溃了。[/quote] 那个类的析构函数里面如何处理dataset???
  • 打赏
  • 举报
回复
引用 11 楼 hdt 的回复:
我觉得很多的时候,把问题描述清楚了,答案自然就出现了 描述不清楚,往往是自己头脑混乱,那样怎么想得到答案?
data在主函数里new的。 然后在一个类中定义了一个double指针,把data赋值给类里面的double指针dataset,最后在类中调用这个函数,参数就是类中的double指针dataset。 最后在主函数里面delete data,然后就崩溃了。
www_adintr_com 2017-12-02
  • 打赏
  • 举报
回复
引用 3 楼 u012197668 的回复:
[quote=引用 2 楼 adlay 的回复:] 应该就是越界了, 你的 "也没有越界" 的结论是如何得出的...
因为除了在这个函数里,其他地方我都没用过data这个指针啊。。 申请的时候是这样的: data=new double[numData*numFeature]; 而且为什么用+=就报错,直接赋值就不报错呢 谢谢~[/quote] 越界的应该不是 data, 是 x 吧
  • 打赏
  • 举报
回复
引用 4 楼 adlay 的回复:
[quote=引用 3 楼 u012197668 的回复:] [quote=引用 2 楼 adlay 的回复:] 应该就是越界了, 你的 "也没有越界" 的结论是如何得出的...
因为除了在这个函数里,其他地方我都没用过data这个指针啊。。 申请的时候是这样的: data=new double[numData*numFeature]; 而且为什么用+=就报错,直接赋值就不报错呢 谢谢~[/quote] 越界的应该不是 data, 是 x 吧[/quote] x指向的是一个numFeature大小的double数组。
  • 打赏
  • 举报
回复
引用 6 楼 dayu_cn 的回复:
出现这个问题我见过最多的问题就是: 1、delete多次 2、在栈空间分配的内存不需要delete 3、根本就没new 然后结合前者几种情况,扫视了几眼程序,我有一个疑问~data在哪new的~
data在主函数里new的。 然后在一个类中定义了一个double指针,把data赋值给类里面的double指针,最后在类中调用这个函数,参数就是类中的double指针。
paschen 版主 2017-12-02
  • 打赏
  • 举报
回复
应该是访问堆内存越界了,导致堆破坏,在释放时导致程序崩溃
  • 打赏
  • 举报
回复
出现这个问题我见过最多的问题就是: 1、delete多次 2、在栈空间分配的内存不需要delete 3、根本就没new 然后结合前者几种情况,扫视了几眼程序,我有一个疑问~data在哪new的~
IT_Kyle 2017-12-02
  • 打赏
  • 举报
回复
试一下传入指针的指针作为作为参数
  • 打赏
  • 举报
回复
引用 2 楼 adlay 的回复:
应该就是越界了, 你的 "也没有越界" 的结论是如何得出的...
因为除了在这个函数里,其他地方我都没用过data这个指针啊。。 申请的时候是这样的: data=new double[numData*numFeature]; 而且为什么用+=就报错,直接赋值就不报错呢 谢谢~
www_adintr_com 2017-12-01
  • 打赏
  • 举报
回复
应该就是越界了, 你的 "也没有越界" 的结论是如何得出的...
  • 打赏
  • 举报
回复
忘记写了,申请的数组就叫data。

65,187

社区成员

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

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