Утечка памяти, источник: float ** binsRowPtrs = new float * [_ nbins]; - PullRequest
0 голосов
/ 02 марта 2012

Как мне удалить это правильно?

float** binsRowPtrs = new float *[_nbins];

Элементы не динамически создаются с новыми.

float** binsRowPtrs = new float *[_nbins];
for (int i = 0; i < _nbins ;i++)
{
    binsRowPtrs[i] = (float*) (bins[i].row(y).data);
}

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Как мне удалить это правильно [?]

Правильно? Вы используете RAII, и пусть что-то еще обрабатывает удаление для вас. В зависимости от того, что вы пытаетесь сделать, вы можете использовать:

  • std::vector<std::vector<float>>: массив массивов с плавающей точкой;
  • std::vector<float*>: массив не принадлежащих указателей на float (т.е. что-то еще обрабатывает правильное размещение и освобождение);
  • или, может быть, просто std::vector<float>: массив с плавающей точкой.
1 голос
/ 02 марта 2012

Правило:

Вызовите столько delete или delete[] соответственно, сколько new или new[] вы использовали и по тем же адресам.

Так что, если вы только что позвонили new на binRowPtrs, вам просто нужно позвонить delete binRowPtrs.

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

Обратите внимание, что в идеале,
В C ++ вы должны использовать динамические выделения только тогда, когда вы не можете их избежать &
Если вам все это нужно, никогда не используйте необработанные указатели, всегда используйте умные указатели RAII до , чтобы избежать явного управления памятью (вы уже заметил, что это опасно в вашем случае).

0 голосов
/ 21 августа 2015

Это очистит эти указатели:

delete [] binsRowPtrs;

Но фактические данные, которые вы храните в ячейках, не будут затронуты.

...