【发布时间】:2012-01-21 18:40:58
【问题描述】:
我正在使用一个使用多个缓冲区的 c++ 程序,并且在运行该程序几分钟后出现了段错误。我不确定正确的方法。我认为给我带来错误的代码目前是这样的:
int *myBuf1, *myBuf2;
myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize);
myBuf2 = myBuf1;
// do work
if(myBuf1) {
free(myBuf1);
}
myBuf1 = NULL;
myBuf2 = NULL;
我的第一个问题是:通过赋值“myBuf2 = myBuf1”,myBuf2 是否分配了 sizeof(int) * maxPacketSize 的不同内存块,还是只是指向 myBuf1 分配的同一块内存的指针?
其次,我是否应该释放 myBuf2 和 myBuf1,然后将两者都设置为 NULL?上面我只释放 myBuf1。或者,最好这样做:
myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize);
myBuf2 = (int*)malloc(sizeof(int) * maxPacketSize);
然后释放两者?
【问题讨论】:
-
为什么在 C++ 中使用
malloc和free?为什么你不知道段错误来自哪里?使用 gdb 运行应用程序。使用bt查找导致崩溃的函数。观察变量。free之前的检查是没有用的。否则,问题一定出在do work。您显示的代码不会出错。 -
请打开编译器上的警告。当编译器在您知道问题之前告诉您问题所在时,事情会变得容易得多。
-
这个项目最初是用 C 语言编写的,我猜你可以说它已经被“移植”到 C++。 '// do work' 部分中的代码调用了需要传入缓冲区的各种其他函数。此外,我已经在 gdb 中加载了核心文件,并且段错误来自 'linked_list.h',它甚至不在我的项目中,我认为它来自某个库。
-
另外,'free'之前的检查怎么没用?如果你尝试释放一个空指针,那不会导致段错误吗?
-
使用 free() 释放 NULL 指针是可以的。没有什么被释放,仅此而已。这不是错误,事实上,C99 要求它不是错误。