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

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

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

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

2. Если вылетание при delete[] статической памяти возможно, то как узнать какой указатель: на динамическую память или статическую. Теоретически мне это не предсnавляется сложным. Если этого нету в C/C++, то может такая возможность есть в WinApi?
Вот, например, есть в функция в которую передается char*. И эта память освобождается в функции. Но в функцию ведь может быть передана и константа и указатель на статическую память.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.05.2013, 03:56
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Цитата Сообщение от faridenco Посмотреть сообщение
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft и пр.
Отвечаю:
Цитата Сообщение от alsav22 Посмотреть сообщение
в любом случае это ошибка.
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
18.05.2013, 06:11
Цитата Сообщение от faridenco Посмотреть сообщение
В первом посте я написал что на моем компиляторе никаких ошибок не выдается и все компилируется нормально.
На процесс компиляции это никак не повлияет - за такими вещами следит программист, а не компилятор.
Цитата Сообщение от faridenco Посмотреть сообщение
Чтобы программы падали я тоже не видел.
Рано или поздно упадет, если, конечно же при компиляции Ваш код не был вырезан
Цитата Сообщение от faridenco Посмотреть сообщение
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft
Освобождение памяти в стеке - ошибка
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.05.2013, 19:03
Цитата Сообщение от 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
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.05.2013, 19:44
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).
По идее должна, так как эта же память потом будет освобождена ещё раз неявно, но винда врядли способна это гарантировать.

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

Решение

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

Добавлено через 2 минуты
еще рассуждают что-то... компетентный контенгент. Классический цэпэпэшник.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.05.2013, 01:15
Как ни формулируй, все понимают, о чём речь идёт.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
20.05.2013, 01:29
точнее "делают вид что понимают"
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.05.2013, 01:48
Лучший ответ Сообщение было отмечено как решение

Решение

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

Не по теме:

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

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

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

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

Впрочем я итак знаю, что программа, скомпилированная компилятором Microsoft, ничего не делает когда встречает delete[] по отношению к статической памяти. Потому что я ни разу не видел, чтобы программы мои падали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.05.2013, 19:56
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru