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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
#1

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

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

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

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

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

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

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

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

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

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

45
Убежденный
Системный программист
Эксперт С++
15633 / 7143 / 1130
Регистрация: 02.05.2013
Сообщений: 11,582
Записей в блоге: 1
Завершенные тесты: 1
20.05.2013, 21:50 #31
Взято из вопроса топикстартера:

Цитата Сообщение от faridenco Посмотреть сообщение
1. Должна ли возникать ошибка (или падение программы) при применении delete[] к статической памяти?
1
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.05.2013, 22:15 #32
Цитата Сообщение от faridenco Посмотреть сообщение
Значит тогда "динамической памяти" тоже нету
Динамической нету. Есть динамически распределяемая, которая распределяется на что-то, сама память не расширяется, сколько она вмещает, столько и будет вмещать, больше в нее не засунешь.

Не по теме:

и вообще раздули из мухи слона

0
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
20.05.2013, 23:35  [ТС] #33
Цитата Сообщение от daslex Посмотреть сообщение
Динамической нету. Есть динамически распределяемая, которая распределяется на что-то, сама память не расширяется, сколько она вмещает, столько и будет вмещать, больше в нее не засунешь.

Не по теме:

и вообще раздули из мухи слона

Это был риторический вопрос. Термин "динамическая память" употребляется к языкам програмирования. А на твою писанину для дедсада мне наплевать.
0
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.05.2013, 23:38 #34
faridenco, тебе еще на первых двух страницах сказали ответ, дедуля.
0
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
20.05.2013, 23:44  [ТС] #35
Цитата Сообщение от daslex Посмотреть сообщение
faridenco, тебе еще на первых двух страницах сказали ответ, дедуля.
Советую в таком случае внимательно все перечитать.
А вообще ответ не дан до сих пор. Я спрашивал про реализации (компиляторы). Более менее имею представление о компилторах Microsoft. А об этом мне ответили на третьей странице. Ни о каких больше реализациях мне не отвечали.
Но, то что это не ошибка, а поведение зависит от реализации - это точно.
0
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
20.05.2013, 23:53 #36
faridenco, очки надень и посмотри

Добавлено через 8 минут
Цитата Сообщение от faridenco Посмотреть сообщение
1. Должна ли возникать ошибка (или падение программы) при применении delete[] к статической памяти? У меня (Microsoft Visual Studio 2005) никаких ошибок не возникает. Но, просто, сталкивался с тем, что на некой 64-х разрядной машине (Windows), при запуске моей 32-х разрядной программы (то есть в эмуляторе) она вылетала в месте где используется delete[] к статической переменной. А также встречал в интернете вопросы о ошибке при delete[] статической памяти, но там не указывался компилятор.
2. Если вылетание при delete[] статической памяти возможно, то как узнать какой указатель: на динамическую память или статическую. Теоретически мне это не предсnавляется сложным. Если этого нету в C/C++, то может такая возможность есть в WinApi?
Вот, например, есть в функция в которую передается char*. И эта память освобождается в функции. Но в функцию ведь может быть передана и константа и указатель на статическую память.
Где?
Цитата Сообщение от faridenco Посмотреть сообщение
Я спрашивал про реализации (компиляторы)
0
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
20.05.2013, 23:54  [ТС] #37
Цитата Сообщение от daslex Посмотреть сообщение
faridenco, очки надень и посмотри
По первому посту ясно, что меня интересует поведение программы при delete[] статической памяти. И что на моем компиляторе нет ошибок. А значит нужна информация о реализациях. Ответ поведение зависит от реализации (undefined behavior) - не ответ.

На первой странице я уточнил (когда мне все еще твердили, что это ошибка).
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft и пр.
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
21.05.2013, 00:06 #38
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от faridenco Посмотреть сообщение
Но, то что это не ошибка, а поведение зависит от реализации - это точно.
Поведение зависит от реализации — это implementation defined, на худой конец
unspecified behavior. А undefined behavior говорит о том, что реализации может вообще никакой не быть, то есть разработчику компилятора не стоит думать о поведении. Поведение непредсказуемо. Несколько запусков одной и той же программы могут давать разное поведение (но разумеется не обязаны).
Само использование "undefined behavior" — это и есть ошибка. Не синтаксическая, а семантическая.
5
daslex
1271 / 515 / 106
Регистрация: 02.08.2011
Сообщений: 2,706
21.05.2013, 00:07 #39
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).
Цитата Сообщение от alsav22 Посмотреть сообщение
Как реагирует компилятор на такое освобождение неважно, в любом случае это ошибка.
Цитата Сообщение от Croessmah Посмотреть сообщение
На процесс компиляции это никак не повлияет - за такими вещами следит программист, а не компилятор.
Цитата Сообщение от Croessmah Посмотреть сообщение
Рано или поздно упадет, если, конечно же при компиляции Ваш код не был вырезан
Цитата Сообщение от taras atavin Посмотреть сообщение
По идее должна, так как эта же память потом будет освобождена ещё раз неявно, но винда врядли способна это гарантировать.
Вам еще на первой странице в один голос твердили, что упадет, что ошибка, что нельзя, но вы считаете себя умнее всех
0
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
21.05.2013, 00:19  [ТС] #40
daslex, ЭТО НЕ ОШИБКА. Перечитай всю ветку и не тормози (или хотя бы мои сообщения).

Добавлено через 6 минут
Само использование "undefined behavior" — это и есть ошибка
Это означает, что поведение стандартом не определено.
И в этой ветке приводили примеры, когда один и тот же код с delete[] или вызывал оишбку или нет, в зависимости от реализации. Хотя по стандарту undefined behavior.
Есть величины размеры которых зависят от реализации, к ним употребляется термин implementation defined.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
21.05.2013, 00:22 #41
Цитата Сообщение от faridenco Посмотреть сообщение
в зависимости от реализации
При чем тут реализация? У меня на 2005 студии данный код падает с тем же сообщением что и у человека в 2008/10/12. WinXP.
0
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
21.05.2013, 00:24  [ТС] #42
Цитата Сообщение от Toshkarik Посмотреть сообщение
При чем тут реализация? У меня на 2005 студии данный код падает с тем же сообщением что и у человека в 2008/10/12. WinXP.
Значит у тебя другая студия. У меня ни при релизе ни при дебаге никаких ошибок нет. А все программы ни разу не вылетали (проверял на разных ОС-х 32-х битных, и на XP).
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.05.2013, 00:25 #43
если программа не падает - это не значит что ошибки нет. она возможно не успела проявиться.
если никаких видимых последствий неправильного вызова delete нет, это не значит что при вызове ничего не происходило и не была допущена ошибка. она возможно не успела проявиться. чтобы утверждать, что ничего не происходит, берите дизасемблер, смотрите что там нагенерилось и если найдете всякого рода проверки и игнорирование вызова - тогда можно говорить о том, что данный конкретный компилятор с конкретными опциями компиляции в конкретной ситуации ничего не делает. можете заложиться на эту "фичу" - флаг вам в руки.
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
21.05.2013, 00:27 #44
Цитата Сообщение от faridenco Посмотреть сообщение
Это означает, что поведение стандартом не определено.
Ну да, ну да. Разыменование нулевого указателя, выходит, тоже не ошибка. Применяй почаще.
0
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
21.05.2013, 00:28  [ТС] #45
DU, как я понял тут говорят об ошибках при компиляции и при отладке.

Ну я эту "фичу" уже в любом случае не буду ипользовать, после того как узнал, как это отрабатывают компиляторы Microsoft. Думал, может есть какая то стабильная линия поведения у этих реализаций. А никаких настроек особых я не ставил в своей студии.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 00:28
Привет! Вот еще темы с ответами:

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

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

Ошибка освобождения памяти new/delete - C++
При выполнении оператора deleterez вылетает ошибка BLOCK_TYPE_IS_VALID(pHead->nBlockUse) #include <iostream> using namespace std;...

Проверка освобождения памяти (new, delete) - C++
Всем привет. Программы помаленьку становятся сложнее. Появляются самодельные контейнеры внутри других самодельных контейнеров внутри...


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

Или воспользуйтесь поиском по форуму:
45
Yandex
Объявления
21.05.2013, 00:28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru