LINUX.ORG.RU

Аллокатор помечает область памяти от tmp[] как неиспользованную, и следующие вызовы new и malloc могут ее задействовать. В приведенном коде undefined behavior типа use after free

annulen ★★★★★
()

Память отметилась как свободная, но пригодится никому ещё не успела. Что тебя смущает?

Stil ★★★★★
()

При освобождении память не перетирается, а просто маркируется как неиспользуемая. При этом, в короткосрочном контексте, она может быть всё ещё доступной и валидной.

В общем, как уже сказали — use after free.

beastie ★★★★★
()
Ответ на: комментарий от annulen

Спасибо, это понятно. Но почему если я пытаюсь создать еще один массив:

int *tmp = new int[15];
то получаю ошибку:
main.cpp:156:7: ошибка: redeclaration of «int* tmp»
  int *tmp = new int[15];
       ^
main.cpp:149:7: замечание: «int* tmp» previously declared here
  int *tmp = new int[5];
       ^
?

shooter93 ★★
() автор топика
Ответ на: комментарий от shooter93

А, ну похоже что сам указатель не уничтожается. Извиняйте за тупняк.

shooter93 ★★
() автор топика
Ответ на: комментарий от shooter93

А это же совсем другое.

Тебе ж компилятор говорит - повторная декларация tmp. Ты в одной области видимости используешь две переменные с одним именем.

После delete [] tmp просто делай tmp = new int[5];, если не хочешь создавать новую переменную.

grondek
()
Ответ на: комментарий от mix_mix

Кстати, я вот подумал, а на сколько вообще возможно писать на C++ не касаясь адресной арифметики? А если использовать Gtkmm?

shooter93 ★★
() автор топика
Ответ на: комментарий от shooter93

Чаще всего её и не нужно касаться. Так из коробки получаешь RAII и всё остальное. Про gtkmm не знаю.

mix_mix ★★★★★
()
Ответ на: комментарий от post-factum

Так, под адресной арифметикой я имел в виду вообще любое использование указателей.

а крайне рекомендуется

А вот это совершенно замечательно! Как раз от C++ меня отпугивает, простите за выражение, «байто****во».

shooter93 ★★
() автор топика
Ответ на: комментарий от hlebushek

Научись использовать std:: array, vector, list, map, string, shared_ptr, unique_ptr, weak_ptr, и адресная арифметика будет не нужна.

ты сферический сказочник в вакууме, пушущий сказочные программы ))))

golodranez ★★★★
()
Ответ на: комментарий от shooter93

на сколько вообще возможно писать на C++ не касаясь адресной арифметики?

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

upcFrost ★★★★★
()
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от anonymous

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

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

вектор есть например. Тормоз

И чем же вектор тормознее рукопашной реализации?

Кстати, использований at для обращения и не видел практически. И без него вектором нормально пользоваться можно.

DarkEld3r ★★★★★
()
Ответ на: комментарий от shooter93

так как у тебя повторное обьевление переменой и её типа в той же области видимости.

если убрать указание на тип перед переменой то при условии что она уже не указывает на валидный адрес - бу всё норм.

а вообще повторюсь посмотри как сделан vector

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

2. ты это говоришь человеку, который не понимает что такое определение переменной?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.