2012-01-21 3 views
0

Я работаю с программой на C++, которая использует несколько буферов, и я получаю ошибку seg за несколько минут до запуска программы. Я не знаю, как правильно это сделать. Код, который я думаю, что дает мне ошибку в настоящее время, как, например:Malloc и бесплатные многократные указатели

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); 

затем бесплатно оба?

+3

Это выглядит больше C, чем C++ – Pubby

+2

Почему вы используете 'malloc' и' free' в C++? Почему вы не знаете, откуда происходит segfault? Запустите приложение с помощью gdb. Используйте 'bt', чтобы найти функцию, которая вызывает сбой. Смотрите переменные. Проверка перед 'free' бесполезна. В противном случае проблема должна быть в 'do work'. Код, который вы показываете, не будет sefault. – pmr

+2

Включите предупреждения в своем компиляторе. Все становится намного легче, когда компилятор говорит вам, что не так, прежде чем вы даже знаете, что что-то не так. –

ответ

5

Вопрос: с присвоением 'myBuf2 = myBuf1', myBuf2 выделяет другой блок памяти?

A: Нет

Q: Во-вторых, я должен освободить myBuf2, а также myBuf1?

A: Нет. Один malloc(), один свободный().

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

A: Да, я настоятельно рекомендую установить ВСЕ указатели в NULL.

+1

К моменту;) – Goz

+1

Это на самом деле хуже ... 'myBuf2' является указателем' int' * not *. Нет гарантии, что 'sizeof (int) == sizeof (int *)' (на самом деле, на любой 64-битной системе вы почти гарантированы, что это не так) - компилятор должен жаловаться на это из git go. –

+0

Да, вы правы, это опечатка .. она должна быть int * для обоих. – Al5678

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 без причины.

Вывод: освобождения любого из них будет достаточно.

И BTW ваш myBuf2 - это всего лишь int, а не int*, что, вероятно, является причиной вашего segfault.

+0

извините, это была опечатка, она должна быть int * – Al5678

0

Изменить

int *myBuf1, myBuf2; 

в

int *myBuf1, *myBuf2; 

Если вы хотите иметь отдельные блоки памяти, вам нужно будет два отдельных выделения ассигнований:

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

calloc Рассмотрите возможность использования.

+0

Спасибо за ввод, я буду читать на calloc. Также это была опечатка, которая должна быть * myBuf2 – Al5678

0

После строки:

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

вы должны проверить, что таНос() не возвращает указатель NULL, указывая на провал. например:

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

Спасибо, это хорошая проверка, которую я буду реализовывать. – Al5678

0

Q: [Должен ли я], то установка как на NULL?

A: Да, я настоятельно рекомендую установить ВСЕ указатели в NULL.

Если вы находитесь внутри блока, нет необходимости устанавливать обратные указатели на нуль. Для компилятора он ничего не делает, и для читателя это более запутанно.

В C++ рекомендуется применять блоки для ограничения объема идентификаторов, особенно указателей.

Смежные вопросы