【问题标题】:Malloc and free multiple pointersmalloc 和释放多指针
【发布时间】: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++ 中使用mallocfree?为什么你不知道段错误来自哪里?使用 gdb 运行应用程序。使用bt 查找导致崩溃的函数。观察变量。 free 之前的检查是没有用的。否则,问题一定出在do work。您显示的代码不会出错。
  • 请打开编译器上的警告。当编译器在您知道问题之前告诉您问题所在时,事情会变得容易得多。
  • 这个项目最初是用 C 语言编写的,我猜你可以说它已经被“移植”到 C++。 '// do work' 部分中的代码调用了需要传入缓冲区的各种其他函数。此外,我已经在 gdb 中加载了核心文件,并且段错误来自 'linked_list.h',它甚至不在我的项目中,我认为它来自某个库。
  • 另外,'free'之前的检查怎么没用?如果你尝试释放一个空指针,那不会导致段错误吗?
  • 使用 free() 释放 NULL 指针是可以的。没有什么被释放,仅此而已。这不是错误,事实上,C99 要求它不是错误。

标签: c++ malloc


【解决方案1】:

问:在赋值 'myBuf2 = myBuf1' 的情况下,myBuf2 是否分配了一个 不同的内存块?

答:没有

问:其次,我应该释放 myBuf2 和 myBuf1 吗?

A:没有。一个 malloc(),一个 free()。

Q: [Should I] then set both to NULL?

答:是的,我强烈建议将所有指针设置为 NULL。

【讨论】:

  • 实际上更糟...myBuf2int 不是 指针。不能保证 sizeof(int) == sizeof(int*)(事实上,在任何 64 位系统上,你几乎可以保证它不是)——编译器应该从 git go 抱怨这个。
  • 是的,你是对的,这是一个错字.. 两者都应该是 int *。
【解决方案2】:

首先,你还没有声明两个指针。

int *myBuf1, myBuf2;

这将myBuf1 声明为int*,将myBuf2 声明为int(不是指针)。你需要写:

int *myBuf1, *mBuf2;

第二,不,将一个指针分配给另一个指针不会复制内存,它只是创建两个指向同一事物的指针。

您只需要free 一个。此外,之后无需设置为NULL,尽管在某些情况下它可以帮助避免一些棘手的错误。

【讨论】:

  • 他需要的是把每个变量放在自己的行上;-)
【解决方案3】:

myBuf1 分配给myBuf2 只会使myBuf2 指向与myBuf1 相同的位置。因此这样做:

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize);
myBuf2 = (int*)malloc(sizeof(int) * maxPacketSize);

然后myBuf1 = myBuf2; 将无缘无故地为myBuf2 分配内存。

结论:释放其中任何一个就足够了。

顺便说一句,您的myBuf2 只是int,而不是int*,这可能是您的段错误的原因。

【讨论】:

  • 抱歉,打错字了,应该是 int*
【解决方案4】:

改变

int *myBuf1, myBuf2;

int *myBuf1, *myBuf2;

如果你想要不同的内存块,你需要两个单独的分配:

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize);
myBuf2 = (int*)malloc(sizeof(int) * maxPacketSize);

考虑使用calloc

【讨论】:

  • 感谢您的输入,我将阅读 calloc。这也是一个错字,应该是 *myBuf2
【解决方案5】:

行后:

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize);

必须检查 malloc( ) 没有返回 NULL 指针,表明失败。例如:

myBuf1 = (int*)malloc(sizeof(int) * maxPacketSize);
if (myBuf1 == NULL) {
  printf ("malloc ( ) failed!\n");
  exit(1);
}

【讨论】:

    【解决方案6】:

    问:[我应该]然后将两者都设置为 NULL 吗?

    答:是的,我强烈建议将所有指针设置为 NULL。

    如果您在一个块内,则将指针设置为空是没有用的。对于编译器来说,它什么都不做,而对于读者来说,它更令人困惑。

    在 C++ 中,使用块来限制标识符的范围是一种很好的做法,尤其是指针。

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 2017-02-25
      • 2014-11-28
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      相关资源
      最近更新 更多