0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
|
|
1 | |
delete[] статической памяти18.05.2013, 03:56. Показов 7283. Ответов 45
Метки нет (Все метки)
1. Должна ли возникать ошибка (или падение программы) при применении delete[] к статической памяти? У меня (Microsoft Visual Studio 2005) никаких ошибок не возникает. Но, просто, сталкивался с тем, что на некой 64-х разрядной машине (Windows), при запуске моей 32-х разрядной программы (то есть в эмуляторе) она вылетала в месте где используется delete[] к статической переменной. А также встречал в интернете вопросы о ошибке при delete[] статической памяти, но там не указывался компилятор.
2. Если вылетание при delete[] статической памяти возможно, то как узнать какой указатель: на динамическую память или статическую. Теоретически мне это не предсnавляется сложным. Если этого нету в C/C++, то может такая возможность есть в WinApi? Вот, например, есть в функция в которую передается char*. И эта память освобождается в функции. Но в функцию ведь может быть передана и константа и указатель на статическую память.
0
|
18.05.2013, 03:56 | |
Ответы с готовыми решениями:
45
Переменные в статической и динамической памяти! Выделение статической памяти, не используя статические объекты Возможно ли обращение к статической памяти функции извне? delete[] *pointer vs. delete pointer и утечка памяти |
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 | ||||||||||
Вопрос не о выделении и удалении памяти. Вопрос о определении: адрес указывает на кучу или на секцию данных, или стэк. Технически в этом проблем нет. Удаление памяти в функции экономит две строчки кода. Но в функцию может быть пердан указатель на статическую память, в этом проблема. Вот наглядные пример экономии строчек кода:
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
18.05.2013, 05:55 | 4 |
Вопрос риторический. Если код с ошибкой, может ли падать программа?
Утвержадть не буду, но навряд ли это можно определить. Ещё раз повторю: если вы пишите код и следите за выделением и освобождением памяти, то вы и должны знать на какую память ссылается указатель. Вы не знаете на какую память ссылается указатель, который возвращает getText()?
1
|
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
|
|
18.05.2013, 06:02 [ТС] | 5 |
0
|
Неэпический
|
|
18.05.2013, 06:11 | 7 |
На процесс компиляции это никак не повлияет - за такими вещами следит программист, а не компилятор.
Рано или поздно упадет, если, конечно же при компиляции Ваш код не был вырезан Освобождение памяти в стеке - ошибка
2
|
Ушел с форума
|
|
19.05.2013, 19:03 | 8 |
2
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
19.05.2013, 19:44 | 9 |
По идее должна, так как эта же память потом будет освобождена ещё раз неявно, но винда врядли способна это гарантировать.
Добавлено через 2 минуты Стандартом языка может и не определено, но ещё есть система и неявное освобождение памяти по выходу за видимость автоматических переменных и при закрытии программы.
1
|
Ушел с форума
|
|
19.05.2013, 20:15 | 10 |
Разве это имеет отношение к вопросу о применении оператора "delete []" к статической памяти ?
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
20.05.2013, 00:45 | 12 |
Сообщение было отмечено как решение
Решение
alsav22, If not. Там же написано. Суть: delete[] можно использовать ТОЛЬКО на то, что было выделено через new[], иначе UB.
3
|
Ушел с форума
|
|
20.05.2013, 01:48 | 17 |
Сообщение было отмечено как решение
Решение
2
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
20.05.2013, 02:23 | 18 |
Убежденный,
Вы не заметили слова duration? Есть понятие статический класс памяти, статический объект/переменная, но никак не "статическая память". Про классы памяти уделяют достаточно внимания в более или менее приличных книгах. Автор видать пропустил тему, раз задается подобным, немного несуразным, вопросом.
1
|
Tulosba
|
20.05.2013, 10:36
#19
|
1
|
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
|
|
20.05.2013, 19:56 [ТС] | 20 |
Значит тогда "динамической памяти" тоже нету. Однако везде этот термин употребляют. Потому что так короче и удобней, умник.
Вопрос совсем не несуразный. Раз на него до сих пор не ответили. Поначалу писали что это ошибка, а оказалось что стандарт это не определяет как ошибку. Ну и раз стандарт это определяет как undefined поведение, то остается в силе мой вопрос об обработке этой ситуации компиляторами, в частности компилятором Microsoft. Впрочем я итак знаю, что программа, скомпилированная компилятором Microsoft, ничего не делает когда встречает delete[] по отношению к статической памяти. Потому что я ни разу не видел, чтобы программы мои падали.
0
|
20.05.2013, 19:56 | |
20.05.2013, 19:56 | |
Помогаю со студенческими работами здесь
20
Освобождение памяти delete Delete[] и утечка памяти Утечка памяти и delete Очистка памяти delete[]; Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |