Как использовать delete [], когда указатель вне выделения памяти? - PullRequest
0 голосов
/ 09 июля 2011

Обратите внимание, что вопрос был изменен и больше не соответствует ответам

Я пытаюсь создать память для хранения буфера поплавков (здесь 4 поплавка). Я выделил память, и все 4 значения в памяти равны нулю.

Цикл, конечно, повторяется 4 раза, но 4-й раз перемещает ptr за пределы памяти, которую я выделил. Поэтому в конце цикла я возвращаю ptr туда, где я выделил память, и использую delete[].

Мой вопрос таков: удаляется ли весь 4-поплавковый буфер при вызове delete[]? (это, очевидно, то, что мне нужно!)

int inFramesToProcess = 4;
float *ptr = new float[inFramesToProcess]();

    for(UInt32 i = 0; i < inFramesToProcess; ++i) {
        ptr++;
    }

    ptr -= inFramesToProcess;

delete[] ptr; 

Ответы [ 2 ]

5 голосов
/ 09 июля 2011

Скопируйте указатель, прежде чем увеличивать его.

int inFramesToProcess = 4;
float *ptr = new float[inFramesToProcess]();
float *ptr_copy = ptr;

    for(UInt32 i = 0; i < inFramesToProcess; ++i) {
        ptr_copy++;
    }

delete[] ptr;

Или просто не используйте указатели для динамических массивов, используйте вместо них vector .Тогда вам не нужно беспокоиться об удалении.

5 голосов
/ 09 июля 2011

Вы не можете.

Вы можете только delete значение, которое вы получаете от new.Сохраняйте оригинальный указатель.

Общее правило:

Старайтесь избегать изменения указателей всегда , независимо от того, насколько умным / профессиональным / "блестящим" он выглядит.Там действительно нет причин (вы можете доказать, что я не прав).Вместо этого используйте подписки;они более читабельны и их легче отлаживать, и они избегают подобных проблем.

...