如何处理非法内存引用?

cugege 2003-09-05 07:45:50
操作系统:UNIX
编程语言:C

请教问题:
我的程序给出 SIGSEGV (11) 错误,请问我该如何处理这种非法内存引用的错误?

谢谢!
...全文
444 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
step_by_step 2003-09-11
  • 打赏
  • 举报
回复
多加强在使用内存时的检查,free之后要记住把指针赋值为0
botao 2003-09-10
  • 打赏
  • 举报
回复
MSDN上的一段话:
Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by malloc, or realloc) may affect subsequent allocation requests and cause errors.

参考一下.
ejiue 2003-09-10
  • 打赏
  • 举报
回复
呵呵。这样的问题我已经遇到很多次了。在用vc的时候。
可惜来晚了。
cugege 2003-09-10
  • 打赏
  • 举报
回复
谢谢各位的支持,我已经找到了根源:
在程序出错时,根本就没有调用初始化部分,所以再去释放内存当然就找不到.
xiaoyunet 2003-09-08
  • 打赏
  • 举报
回复
if (select_dp->I != NULL)
{
if (select_dp->I[i] != (short *) 0)
{
free(select_dp->I[i]); // HERE core dump
select_dp->I[i]=0; //加上这句看看。
}
}

说实话,这段代码是在不怎么样,问题也八成不在这里。引发core dump的原因是重复的释放了内存。如果所有需要释放这块内存的地方都是使用这样的代码,那么加上我所说的这句就是有用的,否则,你还要继续辛苦了。
cugege 2003-09-08
  • 打赏
  • 举报
回复
Hi,
我已经用gdb找到了非法访问的语句,但我不知道如何去改,请问如何修改?

非常感谢!

********************************************************
if (select_dp->I != NULL)
{
if (select_dp->I[i] != (short *) 0)
free(select_dp->I[i]); // HERE core dump
}

其中,select_dp 类型是 "SQLDA *" 类型的
********************************************************
youngS 2003-09-08
  • 打赏
  • 举报
回复
写一个信号处理函数,这样就不会因为段错误让整个程序退出了。
ezhou 2003-09-08
  • 打赏
  • 举报
回复
如果不用动态分配,就不用释放。
cugege 2003-09-08
  • 打赏
  • 举报
回复
1. 我加上 “select_dp->I[i]=0; ”仍然出现core dump.

2. 请教: 如果不用动态分配,请问如何分配内存和释放内存?

多谢!
rtdb 2003-09-08
  • 打赏
  • 举报
回复
不太正常的说, 一个CHAR,一个SHORT, 没必要动态分配的,
这不是自找麻烦么。
cugege 2003-09-08
  • 打赏
  • 举报
回复
另外,对select_dp初始化时,程序如下:

**********************************************************
for (i = 0; i < MAX_ITEMS; i++) {
select_dp->I[i] = (short *) malloc(sizeof(short));
select_dp->V[i] = (char *) malloc(1);
}
***********************************************************
techlibin 2003-09-07
  • 打赏
  • 举报
回复
找到非法访问的语句,修改即可

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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