двойное освобождение или повреждение при удалении объекта (еще один ...) - PullRequest
0 голосов
/ 11 января 2012

Код ниже перемещает элемент на вершину массива

for ( i = j; i > 0; i-- ) {
  myBlk *tmp = blks[i];
  blks[i] = blks[i-1];
  blks[i-1] = tmp;
  delete tmp;
}

когда исполнение достигает delete tmp, я получаю:

*** glibc detected *** double free or corruption (out): 0x00007fffd556ad10 ***

Если я уберу это утверждение, проблем не будет. Но я не хочу утечки памяти ...

Ответы [ 4 ]

2 голосов
/ 11 января 2012

tmp просто указывает на существующий элемент массива.Вы не выделили tmp через new.Поэтому нет необходимости удалять tmp.Я предполагаю, что оригинальные элементы массива размещены и освобождены в другом месте.

1 голос
/ 11 января 2012

Продвижение комментария к ответу.

Кажется, вы путаете распределение памяти с копией указателя. В вашем цикле вы не делаете никакого выделения памяти. Вы просто копируете указатель, который не выделяет память.

Итак, вы должны избавиться от delete:

for ( i = j; i > 0; i-- ) {
  myBlk *tmp = blks[i];
  blks[i] = blks[i-1];
  blks[i-1] = tmp;
}

delete вызывается только при наличии выделения памяти, которого у вас нет. (по крайней мере, ни один внутри цикла)

0 голосов
/ 11 января 2012

Вы удаляете один и тот же элемент каждый раз?

Вы перемещаете удаленный элемент в то, что было i-1, затем уменьшаете i.

0 голосов
/ 11 января 2012

Этот код выглядит очень, очень странно.

Мое предположение (на основании вашего комментария, что «в цикле создается указатель, а в конце цикла я его удаляю».) Я подозреваю, что delete является излишним.

Когда вы звоните delete tmp, это освобождает blks[i-1], так как и tmp, и blks[i-1] указывают на одну и ту же память. Если вы ожидаете, что в конце цикла blks по-прежнему будет содержать действительные указатели, то delete, безусловно, является излишним.

...