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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
19.11.2011, 18:53     Можно ли несколько раз делитить область памяти? #1
Собственно, чреват ли ошибками код:
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;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
19.11.2011, 18:54     Можно ли несколько раз делитить область памяти? #2
собственно, да
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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++
 Аватар для Thinker
4215 / 2189 / 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
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.11.2011, 19:17     Можно ли несколько раз делитить область памяти? #7
Цитата Сообщение от Thinker Посмотреть сообщение
Но не зря же
0, NULL, '\0'
это одно и тоже и отличается только стилем программирования. Разве нет?
в Си NULL это ноль приведенный к void*
в C++ NULL это ноль
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:28     Можно ли несколько раз делитить область памяти? #11
Да, но если вопрос в том, будет ли работать, то ответ - не будет. А так
delete [] a; a = NULL; delete [] a; будет.
Другое дело, что хорошо ли это или плохо.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
19.11.2011, 19:32     Можно ли несколько раз делитить область памяти? #12
Цитата Сообщение от Bers Посмотреть сообщение
Нет никакой гарантии, что NULL - это ноль. На усмотрение изготовителей компиляторов.
так речь о том, что гарантировано на delete NULL ничего не произойдет

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Я сам все время писал NULL, и меня старшие за это постоянно чехвостили. Говорят: пиши тогда уж просто ноль. Так будит безопаснее.
ага, и не переносимей
Цитата Сообщение от Jupiter Посмотреть сообщение
nullptr
так оно лишь в новом стандарте
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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++
 Аватар для Thinker
4215 / 2189 / 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++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:37     Можно ли несколько раз делитить область памяти? #17
Цитата Сообщение от Bers Посмотреть сообщение
не сказать, что хорошо знаю стандарт, но помойму, там идёт проверка на ноль, а не на NULL
Поверьте, именно на NULL. Это как и использование EOF, не всегда же оно может рано быть -1, поэтому мы пишем не -1, а EOF
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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++ Возможно ли узнать, существуют ли другие указатели на данную область памяти?
Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? C++
C++ Закачка файла и перевод в область памяти типа PVOID

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

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

Текущее время: 21:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru