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

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

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

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

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

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++):

Переменные в статической и динамической памяти! - 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; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 04:37 #2
За выделением и освобождением динамической памяти должен следить программист (в самом языке такого контроля нет). Если он за этим действительно следит, то не будет освобождать статическую (или автоматическую) память через delete. Как реагирует компилятор на такое освобождение неважно, в любом случае это ошибка.
faridenco
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;
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 05:55 #4
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).
Вопрос риторический. Если код с ошибкой, может ли падать программа?
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос не о выделении и удалении памяти. Вопрос о определении: адрес указывает на кучу или на секцию данных, или стэк.
Утвержадть не буду, но навряд ли это можно определить. Ещё раз повторю: если вы пишите код и следите за выделением и освобождением памяти, то вы и должны знать на какую память ссылается указатель. Вы не знаете на какую память ссылается указатель, который возвращает getText()?
faridenco
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 26
18.05.2013, 06:02  [ТС] #5
Вы не знаете на какую память ссылается передаваемый ей указатель, который возвращает getText()?
Функция setText не знает на какую память ссылается передаваемый ей указатель. В данном примере экономится две строчки кода. А для некоторых задач может экономится сотни строк кода и это избавит от монотонной безсмысленной работы по сохранению указателей, а затем освобождению.

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

Цитата Сообщение от faridenco Посмотреть сообщение
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft и пр.
Отвечаю:
Цитата Сообщение от alsav22 Посмотреть сообщение
в любом случае это ошибка.
Croessmah
Модератор
Эксперт CЭксперт С++
13135 / 7398 / 828
Регистрация: 27.09.2012
Сообщений: 18,234
Записей в блоге: 3
Завершенные тесты: 1
18.05.2013, 06:11 #7
Цитата Сообщение от faridenco Посмотреть сообщение
В первом посте я написал что на моем компиляторе никаких ошибок не выдается и все компилируется нормально.
На процесс компиляции это никак не повлияет - за такими вещами следит программист, а не компилятор.
Цитата Сообщение от faridenco Посмотреть сообщение
Чтобы программы падали я тоже не видел.
Рано или поздно упадет, если, конечно же при компиляции Ваш код не был вырезан
Цитата Сообщение от faridenco Посмотреть сообщение
Поэтому и спрашиваю, как на это смотрит стандарт, как это отрабатывает компилятор Microsoft
Освобождение памяти в стеке - ошибка
Убежденный
Системный программист
Эксперт С++
15516 / 7014 / 1109
Регистрация: 02.05.2013
Сообщений: 11,452
Завершенные тесты: 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
.
То есть, поведение не определено.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.05.2013, 19:44 #9
Цитата Сообщение от faridenco Посмотреть сообщение
Вопрос был не только про компилятор, а про работу программы, уже скомпилированной (может ли она падать).
По идее должна, так как эта же память потом будет освобождена ещё раз неявно, но винда врядли способна это гарантировать.

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, поведение не определено.
Стандартом языка может и не определено, но ещё есть система и неявное освобождение памяти по выходу за видимость автоматических переменных и при закрытии программы.
Убежденный
Системный программист
Эксперт С++
15516 / 7014 / 1109
Регистрация: 02.05.2013
Сообщений: 11,452
Завершенные тесты: 1
19.05.2013, 20:15 #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Стандартом языка может и не определено, но ещё есть система и неявное освобождение памяти по выходу за видимость автоматических переменных и при закрытии программы.
Разве это имеет отношение к вопросу о применении оператора "delete []" к статической памяти ?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 23:26 #11
Цитата Сообщение от Убежденный Посмотреть сообщение
То есть, поведение не определено.
В английском не силён, но как не перевожу, не вижу, в приведённой цитате из стандарта, где там про статическую память?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.05.2013, 00:45 #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
alsav22, If not. Там же написано. Суть: delete[] можно использовать ТОЛЬКО на то, что было выделено через new[], иначе UB.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.05.2013, 00:55 #13
Понял.
alkagolik
Заблокирован
20.05.2013, 01:05 #14
шо за ересь? "статическая память"... какой наркоман это сформулировал?

Добавлено через 2 минуты
еще рассуждают что-то... компетентный контенгент. Классический цэпэпэшник.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.05.2013, 01:15 #15
Как ни формулируй, все понимают, о чём речь идёт.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2013, 01:15
Привет! Вот еще темы с ответами:

Утечка памяти и 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++
Всем привет. Программы помаленьку становятся сложнее. Появляются самодельные контейнеры внутри других самодельных контейнеров внутри...


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

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

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