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

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

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

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

19.11.2011, 18:53. Просмотров 1708. Ответов 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++):

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

Вывести числа, которые встречаются в массиве несколько раз / один раз - C++
дан массив состоящий из 100 целых чисел. а)Вывести все числа,которие встречаются в етом массиве несколько раз б)Вывести все...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? - C++
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bers
Заблокирован
19.11.2011, 18:54 #2
собственно, да
Thinker
Эксперт C++
4225 / 2199 / 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++
4225 / 2199 / 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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.11.2011, 19:17 #7
Цитата Сообщение от Thinker Посмотреть сообщение
Но не зря же
0, NULL, '\0'
это одно и тоже и отличается только стилем программирования. Разве нет?
в Си NULL это ноль приведенный к void*
в C++ NULL это ноль
Thinker
Эксперт C++
4225 / 2199 / 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++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:28 #11
Да, но если вопрос в том, будет ли работать, то ответ - не будет. А так
delete [] a; a = NULL; delete [] a; будет.
Другое дело, что хорошо ли это или плохо.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
19.11.2011, 19:32 #12
Цитата Сообщение от Bers Посмотреть сообщение
Нет никакой гарантии, что NULL - это ноль. На усмотрение изготовителей компиляторов.
так речь о том, что гарантировано на delete NULL ничего не произойдет

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Я сам все время писал NULL, и меня старшие за это постоянно чехвостили. Говорят: пиши тогда уж просто ноль. Так будит безопаснее.
ага, и не переносимей
Цитата Сообщение от Jupiter Посмотреть сообщение
nullptr
так оно лишь в новом стандарте
Thinker
Эксперт C++
4225 / 2199 / 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++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:35 #15
Цитата Сообщение от Bers Посмотреть сообщение
Каким образом поймав исключение можно обработать программную ошибку ?
Ту фразу я удалил, так как понял с чем это сопряжено.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2011, 19:35
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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