2012-03-28 3 views
1

Это мой код:C++ указатель "ошибка: двойной бесплатно или повреждение (уходит)"

uint16_t * ptemparr = new uint16_t[20]; 
for (int x=0;x<2;x++) 
{ 
    function(ptemparr); 
    ptemparr ++; 

} 
delete[] ptemparr; 

Когда я делаю это я получаю эту ошибку:

double free or corruption (out) 

EDITED: Спасибо I понял, почему я получаю эту ошибку, теперь вы думаете, что это лучшая идея?

uint16_t temparr[20]; 
uint16_t * ptemparr = temparr; 
for (int x=0;x<2;x++) 
{ 
    function(ptemparr); 
    ptemparr ++; 

} 

Таким образом, я делаю указатель на стек, и проблема с утечкой памяти отсутствует. Кроме того, этот код выше должен выполняться раз в 1 сек, поэтому, пожалуйста, обнажить это в виду, прежде чем дать мне знать, что это лучшая практика кодирования для этой ситуации

+0

Почему вы не используете скобки для индексирования? – tartar

+0

funtion возвращает массив внутри ptemparr, приведенный выше код предназначен только для иллюстрации, а ++ - это в действительности ptemparr = ptemparr + 4 – Kam

+0

@Kam. Если вы всегда выделяете x (x = 20 в фрагменте кода), тогда вы Лучше использовать статическое распределение, даже если одна секунда «довольно редко», и разница между статическим и динамическим распределением будет иметь тенденцию исчезать за это время. Затем использование стека или кучи является вопросом вкуса: если к этому вектору нужно получить доступ за пределами блока, куча является обязательной. – Enzo

ответ

4

Вам необходимо пройти один и тот же адрес, чтобы delete [] который был возвращен new [].
Кроме того, убедитесь, что function() не deallocate the memory by calling delete`on пройденный указатель.

+0

Я обновил свой вопрос :) – Kam

+0

@Kam: Да, второй подход лучше. Всегда лучше избегать динамических распределений на C++. На самом деле, лучшие из кодов C++ будут иметь наименьшее использование 'new'.And, если в все, никогда с необработанными указателями. –

0

вам необходимо сбросить ptemparr на домашний адрес, так как вы увеличили его в своем цикле for. поэтому, прежде чем удалять его, я предлагаю уменьшить его на 2.

ptemparr-=2;

+0

Путь слишком неуклюжий. –

+0

@JonathonReinhart делает clunky == неправильным? – Kiril

+0

Нет, и это сработает, но это вряд ли поддерживается, и просто спрашивает о будущих ошибках. –

0

Вы должны delete тот же адрес, возвращаемый new.

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