Как установить указатель на Null во время выполнения (C ++) - PullRequest
0 голосов
/ 19 октября 2010

Прямо сейчас у меня есть указатель на строку в моем 2D-массиве.Я хочу, чтобы этот указатель перестал указывать на эту строку, но позже я буду использовать этот указатель для чего-то другого.Я просто хочу знать, как сбросить указатель после его инициализации и указания на строку.

double* tempRow;
tempRow = (double*) malloc(size * sizeof(double));
   ...
tempRow = NULL;

не освобождает переменную tempRow от строки массива.Почему бы и нет?

Интересно, должен ли я вместо этого использовать C?Будут ли накладные расходы при использовании вектора?

Ответы [ 5 ]

11 голосов
/ 19 октября 2010

Несмотря на то, что вы написали, для tempRow будет установлено значение NULL, оно не освободит выделенную вами память.Для этого вам нужно

free(tempRow);
tempRow = NULL;

Однако, если вы используете C ++, как предлагают теги, было бы лучше использовать C ++ new / delete

double* tempRow;
tempRow = new double[size];
   ...
delete [] tempRow;
tempRow = NULL;

, вы даже можете использоватьSTL для управления вашим выделением памяти для вас.

std::vector<double> tempRow(size);
// You can access the data, in a similar way to an array
tempRow[5] = tempRow[4]+tempRow[3];

// If you really need to access the underlying pointer, (To pass to another 
// function for example) you can do this. Note that the pointer will be valid
// until the vector is destroyed or modified in certain ways that can cause the
// vector to reallocate its memory. So you can't use this to pass data to a 
// function that destroys or takes ownership of the passed in pointer.

fn_requiring_pointer( &temp[0] );

// The memory used in tempRow will get cleaned up automatically when the 
// object goes out of scope
//
// If I really need to free up the memory used in it early I can use a swap 
// hack. (iirc tempRow.clear() isn't guaranteed to release the memory)
std::vector<double>().swap(tempRow); // Unneeded in most cases.

Также пытаться повторно использовать указатель tempRow для чего-то несвязанного, вероятно, не нужно.Просто создайте новый указатель с другим именем.Многократное использование переменной в нескольких разных целях может затруднить понимание кода позже.

6 голосов
/ 19 октября 2010

Я также новичок в C ++, но некоторое время назад кто-то сказал мне, что использование std::vector является гораздо более безопасным подходом к обработке массивов данных.

  • Автоматическое перераспределение при добавлении дополнительных элементов.
  • Итераторы для использования с вещами из #include <algorithm>.
  • Защита границ с доступом к элементу .at(index).
  • Не требуется беспорядочное отслеживание указателя.
  • Доступ в стиле массива C с помощью operator[].
  • RAII.

Вы бы объявили вектор следующим образом:

std::vector<double> tempRow(size);

tempRow[0] = 3.00;
tempRow[1] = 1.00;

// no need to use delete[] or free(), it will destruct itself
// and relinquish its resources automatically.
4 голосов
/ 19 октября 2010

Пример, который вы показали, должен работать.
Также , если вы не освободили память перед выполнением temRow NULL, вы протекают память.

double* tempRow;
tempRow = (double*) malloc(size * sizeof(double));
   ...
free(tempRow);  // free the memory.
tempRow = NULL; // reset the pointer.
   ...
tempRow = &some_other_double_var; // reuse the pointer.
4 голосов
/ 19 октября 2010

Кажется, не работает?

Это наихудшая жалоба и кошмар поставщиков решений.

Вы имеете ввиду ошибку компиляции?

Если да, вы включили <cstdio>? и using namespace std;

2 голосов
/ 19 октября 2010

Каким образом не работает? Обычный способ «отменить» указатель в C ++ - с помощью:

tempRow = 0;

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

Кроме того, сначала вы должны вызвать free() в этой памяти, прежде чем потерять указатель, в противном случае у вас будет утечка памяти (и это предполагает, что у вас есть веская причина использовать стиль C * malloc/free вместо тем более кошерный C ++ new/delete).

...