Malloc和免费多指针

时间:2012-01-21 18:40:58

标签: c++ malloc

我正在使用一个使用多个缓冲区的c ++程序,并且在运行程序的几分钟内我遇到了一个seg错误。我不确定正确的方法。我认为代码给我的错误是:

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分配的同一内存块的指针? / p>

其次,我应该释放myBuf2以及myBuf1,然后将两者都设置为NULL吗?上面我只是释放myBuf1。或者,最好这样做:

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

然后释放两个?

6 个答案:

答案 0 :(得分:6)

  

问:使用赋值'myBuf2 = myBuf1',myBuf2是否分配了一个   不同的记忆块?

答:没有

  

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

答:没有。一个malloc(),一个free()。​​

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

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

答案 1 :(得分:2)

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

int *myBuf1, myBuf2;

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

int *myBuf1, *mBuf2;

其次,不,将一个指针指向另一个不会复制内存,它只会创建两个指向同一事物的指针。

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

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:0)

更改

int *myBuf1, myBuf2;

int *myBuf1, *myBuf2;

如果您想拥有不同的内存块,则需要两个单独的分配:

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

考虑使用calloc

答案 4 :(得分:0)

行后:

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

必须 检查malloc()是否没有返回NULL指针,表示失败。 e.g:

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

答案 5 :(得分:0)

  

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

     

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

如果你在一个块内,则不使用将指针设置为null。对于编译器来说,它什么都不做,对于读者来说,它更令人困惑。

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