Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
18.05.2013, 03:56     delete[] статической памяти #1
1. Должна ли возникать ошибка (или падение программы) при применении delete[] к статической памяти? У меня (Microsoft Visual Studio 2005) никаких ошибок не возникает. Но, просто, сталкивался с тем, что на некой 64-х разрядной машине (Windows), при запуске моей 32-х разрядной программы (то есть в эмуляторе) она вылетала в месте где используется delete[] к статической переменной. А также встречал в интернете вопросы о ошибке при delete[] статической памяти, но там не указывался компилятор.

2. Если вылетание при delete[] статической памяти возможно, то как узнать какой указатель: на динамическую память или статическую. Теоретически мне это не предсnавляется сложным. Если этого нету в C/C++, то может такая возможность есть в WinApi?
Вот, например, есть в функция в которую передается char*. И эта память освобождается в функции. Но в функцию ведь может быть передана и константа и указатель на статическую память.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 03:56     delete[] статической памяти
Посмотрите здесь:

C++ утечка памяти и delete
C++ освобождение памяти delete
Удаление памяти посредством delete[] C++
C++ Очистка памяти delete[];
delete[] *pointer vs. delete pointer и утечка памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 04:37     delete[] статической памяти #2
За выделением и освобождением динамической памяти должен следить программист (в самом языке такого контроля нет). Если он за этим действительно следит, то не будет освобождать статическую (или автоматическую) память через delete. Как реагирует компилятор на такое освобождение неважно, в любом случае это ошибка.
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
18.05.2013, 05:35  [ТС]     delete[] статической памяти #3
За выделением и освобождением динамической памяти должен следить программист (в самом языке такого контроля нет). Если он за этим действительно следит, то не будет освобождать статическую (или автоматическую) память через delete. Как реагирует компилятор на такое освобождение неважно, в любом случае это ошибка.
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).

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

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

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

Цитата Сообщение от faridenco Посмотреть сообщение
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft и пр.
Отвечаю:
Цитата Сообщение от alsav22 Посмотреть сообщение
в любом случае это ошибка.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
18.05.2013, 06:11     delete[] статической памяти #7
Цитата Сообщение от faridenco Посмотреть сообщение
В первом посте я написал что на моем компиляторе никаких ошибок не выдается и все компилируется нормально.
На процесс компиляции это никак не повлияет - за такими вещами следит программист, а не компилятор.
Цитата Сообщение от faridenco Посмотреть сообщение
Чтобы программы падали я тоже не видел.
Рано или поздно упадет, если, конечно же при компиляции Ваш код не был вырезан
Цитата Сообщение от faridenco Посмотреть сообщение
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft
Освобождение памяти в стеке - ошибка
Убежденный
Системный программист
 Аватар для Убежденный
14173 / 6188 / 981
Регистрация: 02.05.2013
Сообщений: 10,295
Завершенные тесты: 1
19.05.2013, 19:03     delete[] статической памяти #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
.
То есть, поведение не определено.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.05.2013, 19:44     delete[] статической памяти #9
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).
По идее должна, так как эта же память потом будет освобождена ещё раз неявно, но винда врядли способна это гарантировать.

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, поведение не определено.
Стандартом языка может и не определено, но ещё есть система и неявное освобождение памяти по выходу за видимость автоматических переменных и при закрытии программы.
Убежденный
Системный программист
 Аватар для Убежденный
14173 / 6188 / 981
Регистрация: 02.05.2013
Сообщений: 10,295
Завершенные тесты: 1
19.05.2013, 20:15     delete[] статической памяти #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Стандартом языка может и не определено, но ещё есть система и неявное освобождение памяти по выходу за видимость автоматических переменных и при закрытии программы.
Разве это имеет отношение к вопросу о применении оператора "delete []" к статической памяти ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 23:26     delete[] статической памяти #11
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, поведение не определено.
В английском не силён, но как не перевожу, не вижу, в приведённой цитате из стандарта, где там про статическую память?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.05.2013, 00:45     delete[] статической памяти #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
alsav22, If not. Там же написано. Суть: delete[] можно использовать ТОЛЬКО на то, что было выделено через new[], иначе UB.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.05.2013, 00:55     delete[] статической памяти #13
Понял.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
20.05.2013, 01:05     delete[] статической памяти #14
шо за ересь? "статическая память"... какой наркоман это сформулировал?

Добавлено через 2 минуты
еще рассуждают что-то... компетентный контенгент. Классический цэпэпэшник.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.05.2013, 01:15     delete[] статической памяти #15
Как ни формулируй, все понимают, о чём речь идёт.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
20.05.2013, 01:29     delete[] статической памяти #16
точнее "делают вид что понимают"
Убежденный
Системный программист
 Аватар для Убежденный
14173 / 6188 / 981
Регистрация: 02.05.2013
Сообщений: 10,295
Завершенные тесты: 1
20.05.2013, 01:48     delete[] статической памяти #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
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.05.2013, 02:23     delete[] статической памяти #18
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
static storage duration
Вы не заметили слова duration? Есть понятие статический класс памяти, статический объект/переменная, но никак не "статическая память". Про классы памяти уделяют достаточно внимания в более или менее приличных книгах. Автор видать пропустил тему, раз задается подобным, немного несуразным, вопросом.
Tulosba
20.05.2013, 10:36
  #19

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2013, 19:56     delete[] статической памяти
Еще ссылки по теме:

Переменные в статической и динамической памяти! C++
C++ Выделение статической памяти, не используя статические объекты
C++ Возможно ли обращение к статической памяти функции извне?

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

Или воспользуйтесь поиском по форуму:
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
20.05.2013, 19:56  [ТС]     delete[] статической памяти #20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Убежденный,

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

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

Впрочем я итак знаю, что программа, скомпилированная компилятором Microsoft, ничего не делает когда встречает delete[] по отношению к статической памяти. Потому что я ни разу не видел, чтобы программы мои падали.
Yandex
Объявления
20.05.2013, 19:56     delete[] статической памяти
Ответ Создать тему
Опции темы

Текущее время: 05:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru