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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
#1

Можно ли несколько раз делитить область памяти? - C++

19.11.2011, 18:53. Просмотров 1676. Ответов 42
Метки нет (Все метки)

Собственно, чреват ли ошибками код:
C++
1
2
3
4
5
6
7
8
int *a;
 
a = new int[2];
a[0] = 1;
a[1] = 2;
 
delete [] a;
delete [] a;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2011, 18:53     Можно ли несколько раз делитить область памяти?
Посмотрите здесь:

Можно ли в С++ выделить память под объект в заданную мной область памяти? - C++
Есть код static inline void convertFromTextAlternative(quint8* dst, const QVariant& src){ QString *a = new...

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

Разделяемая область памяти - C++
Здравствуйте. Нам задали такое задание - написать программку(ки, ибо больше одного запущенного процесса) и запустить, чтобы выполнилось...

Динамическая область памяти функции new - C++
Чистый Си У кого есть варианты с пояснениями Написать пользовательскую функцию, решающую указанную ниже задачу. Массив создается в...

Указатель на конкретную область памяти - C++
Есть такая программа ArtMoney, с её помощью мы ищем адрес в памяти, затем изменяем значение по указателю, чтобы изменить количество игровой...

Закачка файла и перевод в область памяти типа PVOID - C++
В общем моя программа скачивает библиотеку, грузит ее в память и из памяти библиотека грузится в процесс посредством manual mapping. Но...

Bin файл из Modbus. Прочитать из файла область памяти - C++
Доброго времени суток! Подскажите пожалуйста, у меня есть bin-файл из которого нужно достать данные полученные устройством и хранящиеся...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
19.11.2011, 18:54     Можно ли несколько раз делитить область памяти? #2
собственно, да
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:03     Можно ли несколько раз делитить область памяти? #3
Вот так можно:
C++
1
2
3
4
5
6
7
8
9
int *a = NULL;
 
a = new int[2];
a[0] = 1;
a[1] = 2;
 
delete [] a;
a = NULL;
delete [] a;
Bers
Заблокирован
19.11.2011, 19:06     Можно ли несколько раз делитить область памяти? #4
Цитата Сообщение от Thinker Посмотреть сообщение
Вот так можно:
Нет никакой гарантии, что NULL - это ноль. На усмотрение изготовителей компиляторов.
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:08     Можно ли несколько раз делитить область памяти? #5
Цитата Сообщение от Bers Посмотреть сообщение
Нет никакой гарантии, что NULL - это ноль. На усмотрение изготовителей компиляторов.
В первый раз такое слышу, но спорить не буду, вдруг правда. Но не зря же
0, NULL, '\0'
это одно и тоже и отличается только стилем программирования. Разве нет?
Bers
Заблокирован
19.11.2011, 19:15     Можно ли несколько раз делитить область памяти? #6
Цитата Сообщение от Thinker Посмотреть сообщение
это одно и тоже и отличается только стилем программирования. Разве нет?
Традиционно NULL это "не_валидный адрес". Ну или "значение указателя, который никуда не указывает".

Но на некоторых машинах используют нулевой адрес. То есть по нулевому адресу реально можно что то записывать.
Там нулевой адрес валиден. А указатели указывающие на этот адрес "указывают на что-то".

Соответственно значение "указателя указывающего в никуда" равняется не 0, а какому то другому числу.

Соответственно, компилятор может для такой машины задефайнить NULL (не_валидному адресу) другое число отличное от нуля.


Что бы не иметь проблем можно:

задефайнить собственный NULL_PTR
дважды дефайнить NULL 0 //если препроцессор пофиксит факт переопределения, то он хотя бы выдаст предупреждение

а лучше всего юзать null_ptr из нового стандарта
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.11.2011, 19:17     Можно ли несколько раз делитить область памяти? #7
Цитата Сообщение от Thinker Посмотреть сообщение
Но не зря же
0, NULL, '\0'
это одно и тоже и отличается только стилем программирования. Разве нет?
в Си NULL это ноль приведенный к void*
в C++ NULL это ноль
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:24     Можно ли несколько раз делитить область памяти? #8
Bers, если написать a = NULL, а затем dekete, то ошибки не будет, так как происходит проверка, равно ли a NULL или не равно. Так вот если равно, то ничего не происходит.

Цитата Сообщение от Jupiter Посмотреть сообщение
в Си NULL это ноль приведенный к void*
в C++ NULL это ноль
Ну я так и говорю))
Bers
Заблокирован
19.11.2011, 19:24     Можно ли несколько раз делитить область памяти? #9
Цитата Сообщение от Thinker Посмотреть сообщение
Bers, это все понятно, но если написать a = NULL, а затем dekete, то ошибки не будет, так происходит проверка, равно ли a NULL или не равно. Так вот если равно, то ничего не происходит.
Я сам все время писал NULL, и меня старшие за это постоянно чехвостили. Говорят: пиши тогда уж просто ноль. Так будит безопаснее. Щас начал писать NULL_PTR

А вообще, вот такой код:

C++
1
delete [] a; delete [] a;
Более безопасен, чем вот такой:

C++
1
delete [] a; a=0; delete [] a;
В обоих случаях допущена самая коварная из всех разновидностей ошибок - семантическая.
Только во втором случае, код окажет программисту медвежью услугу - он будит работать, а программисту будит трудно понять, почему "все работает, но делает не то, что ожидалось?".

Если есть ошибки в логике программы, или ошибки программные - лучше пусть приложение упадёт сразу же, и желательно в месте источника аварии. Чем оно упадёт далеко от настоящей причины, либо не упадёт вообще, но будит делать непойми что.
Jupiter
19.11.2011, 19:27
  #10

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
null_ptr из нового стандарта
Цитата Сообщение от Bers Посмотреть сообщение
Щас начал писать NULL_PTR
правильно
C++
1
nullptr //вместе и в нижнем регистре

Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:28     Можно ли несколько раз делитить область памяти? #11
Да, но если вопрос в том, будет ли работать, то ответ - не будет. А так
delete [] a; a = NULL; delete [] a; будет.
Другое дело, что хорошо ли это или плохо.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
19.11.2011, 19:32     Можно ли несколько раз делитить область памяти? #12
Цитата Сообщение от Bers Посмотреть сообщение
Нет никакой гарантии, что NULL - это ноль. На усмотрение изготовителей компиляторов.
так речь о том, что гарантировано на delete NULL ничего не произойдет

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Я сам все время писал NULL, и меня старшие за это постоянно чехвостили. Говорят: пиши тогда уж просто ноль. Так будит безопаснее.
ага, и не переносимей
Цитата Сообщение от Jupiter Посмотреть сообщение
nullptr
так оно лишь в новом стандарте
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:32     Можно ли несколько раз делитить область памяти? #13
Цитата Сообщение от alex_x_x Посмотреть сообщение
так речь о том, что гарантировано на delete NULL ничего не произойдет
Во-во, это и пытаюсь сказать, так как сначала происходит проверка на NULL.
Bers
Заблокирован
19.11.2011, 19:35     Можно ли несколько раз делитить область памяти? #14
Цитата Сообщение от Thinker Посмотреть сообщение
Другое дело, что хорошо ли это или плохо. Да, лучше с исключениями работать.
Каким образом поймав исключение можно обработать программную ошибку ?

Допустим, взять обращение к объекту по нулевому указателю. Как такое вообще могло произойти? Ну это ошибка самого программиста. Это баг в коде.
Как эту ошибку можно обработать с помощью исключений?

Я вот ничего умнее не смог придумать, кроме как поставить ассерт, и тестировать, тестировать, тестировать. А если ассерт сработал - дебажить, выяснять причину, исправлять. И заново компилировать.

Как можно исправить ошибку программиста с помощью исключений?

Добавлено через 53 секунды
Цитата Сообщение от alex_x_x Посмотреть сообщение
так речь о том, что гарантировано на delete NULL ничего не произойдет
Гарантированно оно, если delete []a; a=0;

Не?

А если дефайн - никаких гарантий нет.
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:35     Можно ли несколько раз делитить область памяти? #15
Цитата Сообщение от Bers Посмотреть сообщение
Каким образом поймав исключение можно обработать программную ошибку ?
Ту фразу я удалил, так как понял с чем это сопряжено.
Bers
Заблокирован
19.11.2011, 19:36     Можно ли несколько раз делитить область памяти? #16
Цитата Сообщение от Thinker Посмотреть сообщение
так как сначала происходит проверка на NULL.
не сказать, что хорошо знаю стандарт, но помойму, там идёт проверка на ноль, а не на NULL
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:37     Можно ли несколько раз делитить область памяти? #17
Цитата Сообщение от Bers Посмотреть сообщение
не сказать, что хорошо знаю стандарт, но помойму, там идёт проверка на ноль, а не на NULL
Поверьте, именно на NULL. Это как и использование EOF, не всегда же оно может рано быть -1, поэтому мы пишем не -1, а EOF
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
19.11.2011, 19:38     Можно ли несколько раз делитить область памяти? #18
посмотрел - для си также
The free function causes the space pointed to by ptr to be deallocated, that is, made
available for further allocation. If ptr is a null pointer, no action occurs.
The macros are
NULL
which expands to an implementation-defined null pointer constant
Bers
Заблокирован
19.11.2011, 19:39     Можно ли несколько раз делитить область памяти? #19
Цитата Сообщение от Thinker Посмотреть сообщение
Поверьте, именно на NULL
На самом деле это важный момент. Потому что если проверка именно на NULL, значит NULL не всегда ноль, но всегда "не_валидный адрес".

Так получается?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2011, 19:39     Можно ли несколько раз делитить область памяти?
Еще ссылки по теме:

Возможно ли узнать, существуют ли другие указатели на данную область памяти? - C++
Возможно ли узнать, существуют ли другие указатели на данную область памяти? например: char * pChar = new char; //init ...

Ссылка, Указатель, Область памяти выделенная оператором new для указателя - C++
Подскажите пожалуйста, как сделать ссылку на область памяти выделенную оператором new для указателя читая книгу Джесса Либерти в...

Есть ли способ проверить, сколько указателей указывают на определённую область памяти? - C++
Привет народ. Такой вопрос: Есть ли способ проверить, сколько указателей указывают на определённую область памяти? Спасибо.

Увеличение чисел в несколько раз - C++
Здравствуйте. Сразу же извиняюсь за свой "тупой" вопрос, я в С++ недавно так что помогите. Как увеличить число в 2 раза. Например я ввожу...

goto проходит несколько раз - C++
Есть код: int main() { char pwd; pwd: printf("> "); getline(pwd,15); if(strstr(pwd,"1234567")) {if(pwd!=ch-1+'0')...


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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
19.11.2011, 19:39     Можно ли несколько раз делитить область памяти? #20
Цитата Сообщение от Bers Посмотреть сообщение
не сказать, что хорошо знаю стандарт, но помойму, там идёт проверка на ноль, а не на NULL
там оперируют словами null pointer, а NULL - const null pointer
Yandex
Объявления
19.11.2011, 19:39     Можно ли несколько раз делитить область памяти?
Ответ Создать тему
Опции темы

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