Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/37: Рейтинг темы: голосов - 37, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
1

delete[] статической памяти

18.05.2013, 03:56. Показов 7283. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1. Должна ли возникать ошибка (или падение программы) при применении delete[] к статической памяти? У меня (Microsoft Visual Studio 2005) никаких ошибок не возникает. Но, просто, сталкивался с тем, что на некой 64-х разрядной машине (Windows), при запуске моей 32-х разрядной программы (то есть в эмуляторе) она вылетала в месте где используется delete[] к статической переменной. А также встречал в интернете вопросы о ошибке при delete[] статической памяти, но там не указывался компилятор.

2. Если вылетание при delete[] статической памяти возможно, то как узнать какой указатель: на динамическую память или статическую. Теоретически мне это не предсnавляется сложным. Если этого нету в C/C++, то может такая возможность есть в WinApi?
Вот, например, есть в функция в которую передается char*. И эта память освобождается в функции. Но в функцию ведь может быть передана и константа и указатель на статическую память.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2013, 03:56
Ответы с готовыми решениями:

Переменные в статической и динамической памяти!
Народ, подскажите как этот рисунок перевести в программу! тоесть как с помощью программы разместить...

Выделение статической памяти, не используя статические объекты
Здравствуйте! Как известно, когда мы объявляем статическую переменную, то компилятор выделяет ей...

Возможно ли обращение к статической памяти функции извне?
Здравствуйте! Возможно ли сделать так? Obj* ptr; void F() { static Obj _obj = { }; ...

delete[] *pointer vs. delete pointer и утечка памяти
Здравствуйте! Есть класс "умного" указателя counted_ptr, который удаляет хранящийся в нём T*...

45
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 04:37 2
За выделением и освобождением динамической памяти должен следить программист (в самом языке такого контроля нет). Если он за этим действительно следит, то не будет освобождать статическую (или автоматическую) память через delete. Как реагирует компилятор на такое освобождение неважно, в любом случае это ошибка.
2
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
18.05.2013, 05:35  [ТС] 3
За выделением и освобождением динамической памяти должен следить программист (в самом языке такого контроля нет). Если он за этим действительно следит, то не будет освобождать статическую (или автоматическую) память через delete. Как реагирует компилятор на такое освобождение неважно, в любом случае это ошибка.
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).

Вопрос не о выделении и удалении памяти. Вопрос о определении: адрес указывает на кучу или на секцию данных, или стэк. Технически в этом проблем нет.

Удаление памяти в функции экономит две строчки кода. Но в функцию может быть пердан указатель на статическую память, в этом проблема.
Вот наглядные пример экономии строчек кода:
C++
1
setText(input->getText());
вместо:
C++
1
2
3
char* str = input->getText();
setText(str);
delete[] str;
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 05:55 4
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).
Вопрос риторический. Если код с ошибкой, может ли падать программа?
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос не о выделении и удалении памяти. Вопрос о определении: адрес указывает на кучу или на секцию данных, или стэк.
Утвержадть не буду, но навряд ли это можно определить. Ещё раз повторю: если вы пишите код и следите за выделением и освобождением памяти, то вы и должны знать на какую память ссылается указатель. Вы не знаете на какую память ссылается указатель, который возвращает getText()?
1
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
18.05.2013, 06:02  [ТС] 5
Вы не знаете на какую память ссылается передаваемый ей указатель, который возвращает getText()?
Функция setText не знает на какую память ссылается передаваемый ей указатель. В данном примере экономится две строчки кода. А для некоторых задач может экономится сотни строк кода и это избавит от монотонной безсмысленной работы по сохранению указателей, а затем освобождению.

Если код с ошибкой, может ли падать программа
В первом посте я написал что на моем компиляторе никаких ошибок не выдается и все компилируется нормально. Чтобы программы падали я тоже не видел. Но мне сообщили что программа падает, в том месте (delete[], статической памяти) на 64-х битной винде. Но так как прога запускалась на эмуляторе (32-х битная прога) я не могу быть уверен, что дело именно не в кривой работе эмулятора. Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft и пр.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 06:10 6
Цитата Сообщение от faridenco Посмотреть сообщение
Функция setText не знает на какую память ссылается передаваемый ей указатель.
Я не спрашивал знает ли это функция.
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы не знаете на какую память ссылается указатель, который возвращает getText()?
Это проблема не функции, а того кто пишет код.

Цитата Сообщение от faridenco Посмотреть сообщение
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft и пр.
Отвечаю:
Цитата Сообщение от alsav22 Посмотреть сообщение
в любом случае это ошибка.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
18.05.2013, 06:11 7
Цитата Сообщение от faridenco Посмотреть сообщение
В первом посте я написал что на моем компиляторе никаких ошибок не выдается и все компилируется нормально.
На процесс компиляции это никак не повлияет - за такими вещами следит программист, а не компилятор.
Цитата Сообщение от faridenco Посмотреть сообщение
Чтобы программы падали я тоже не видел.
Рано или поздно упадет, если, конечно же при компиляции Ваш код не был вырезан
Цитата Сообщение от faridenco Посмотреть сообщение
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft
Освобождение памяти в стеке - ошибка
2
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.05.2013, 19:03 8
Цитата Сообщение от faridenco Посмотреть сообщение
1. Должна ли возникать ошибка (или падение программы) при применении delete[] к статической памяти?
В стандарте C++ 2003 года сказано:
5.3.5 Delete

...

2. In the second alternative (delete array), the value of the operand of delete shall be
the pointer value which resulted from a previous array new-expression. If not, the
behavior is undefined
.
То есть, поведение не определено.
2
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.05.2013, 19:44 9
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).
По идее должна, так как эта же память потом будет освобождена ещё раз неявно, но винда врядли способна это гарантировать.

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, поведение не определено.
Стандартом языка может и не определено, но ещё есть система и неявное освобождение памяти по выходу за видимость автоматических переменных и при закрытии программы.
1
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.05.2013, 20:15 10
Цитата Сообщение от taras atavin Посмотреть сообщение
Стандартом языка может и не определено, но ещё есть система и неявное освобождение памяти по выходу за видимость автоматических переменных и при закрытии программы.
Разве это имеет отношение к вопросу о применении оператора "delete []" к статической памяти ?
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 23:26 11
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, поведение не определено.
В английском не силён, но как не перевожу, не вижу, в приведённой цитате из стандарта, где там про статическую память?
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.05.2013, 00:45 12
Лучший ответ Сообщение было отмечено как решение

Решение

alsav22, If not. Там же написано. Суть: delete[] можно использовать ТОЛЬКО на то, что было выделено через new[], иначе UB.
3
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.05.2013, 00:55 13
Понял.
0
Заблокирован
20.05.2013, 01:05 14
шо за ересь? "статическая память"... какой наркоман это сформулировал?

Добавлено через 2 минуты
еще рассуждают что-то... компетентный контенгент. Классический цэпэпэшник.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.05.2013, 01:15 15
Как ни формулируй, все понимают, о чём речь идёт.
0
Заблокирован
20.05.2013, 01:29 16
точнее "делают вид что понимают"
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
20.05.2013, 01:48 17
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от alkagolik Посмотреть сообщение
шо за ересь? "статическая память"... какой наркоман это сформулировал?
C++, Стандарт-2003:
3.7 Storage duration

1. Storage duration is the property of an object that defines the minimum potential
lifetime of the storage con-taining the object. The storage duration is determined by
the construct used to create the object and is one of the following:

- static storage duration
- automatic storage duration
- dynamic storage duration
2
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
20.05.2013, 02:23 18
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
static storage duration
Вы не заметили слова duration? Есть понятие статический класс памяти, статический объект/переменная, но никак не "статическая память". Про классы памяти уделяют достаточно внимания в более или менее приличных книгах. Автор видать пропустил тему, раз задается подобным, немного несуразным, вопросом.
1
Tulosba
20.05.2013, 10:36
  #19

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
статическая память
ну это ж SRAM, та что на триггерах :)

1
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
20.05.2013, 19:56  [ТС] 20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Убежденный,

Вы не заметили слова duration? Есть понятие статический класс памяти, статический объект/переменная, но никак не "статическая память". Про классы памяти уделяют достаточно внимания в более или менее приличных книгах. Автор видать пропустил тему, раз задается подобным, немного несуразным, вопросом.
Значит тогда "динамической памяти" тоже нету. Однако везде этот термин употребляют. Потому что так короче и удобней, умник.

Вопрос совсем не несуразный. Раз на него до сих пор не ответили. Поначалу писали что это ошибка, а оказалось что стандарт это не определяет как ошибку. Ну и раз стандарт это определяет как undefined поведение, то остается в силе мой вопрос об обработке этой ситуации компиляторами, в частности компилятором Microsoft.

Впрочем я итак знаю, что программа, скомпилированная компилятором Microsoft, ничего не делает когда встречает delete[] по отношению к статической памяти. Потому что я ни разу не видел, чтобы программы мои падали.
0
20.05.2013, 19:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2013, 19:56
Помогаю со студенческими работами здесь

Освобождение памяти delete
Если у меня есть указатель (pt) N-ой степени, я присвоил ему указатель на начало массива (N - 1)ой...

Delete[] и утечка памяти
Как можно избежать вытока памяти? И вообще почкму криво работает? #include<iostream>...

Утечка памяти и delete
Вот накопились вопросы про утечки памяти. 1) Как проявляется утечка памяти? На многих сайтах...

Очистка памяти delete[];
Есть функция ввида: void loltest(int md3) { char* randChars; int cCount; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru