我正在使用一个使用多个缓冲区的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);
然后释放两个?
答案 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 ++中,使用块来限制标识符的范围是一种很好的做法,尤其是指针。