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

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

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

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

19.11.2011, 18:53. Просмотров 1781. Ответов 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;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
Чистый Си У кого есть варианты с пояснениями Написать пользовательскую функцию, решающую указанную ниже задачу. Массив создается в...

42
Bers
Заблокирован
19.11.2011, 19:36 #16
Цитата Сообщение от Thinker Посмотреть сообщение
так как сначала происходит проверка на NULL.
не сказать, что хорошо знаю стандарт, но помойму, там идёт проверка на ноль, а не на NULL
0
Thinker
Эксперт С++
4231 / 2205 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
19.11.2011, 19:37 #17
Цитата Сообщение от Bers Посмотреть сообщение
не сказать, что хорошо знаю стандарт, но помойму, там идёт проверка на ноль, а не на NULL
Поверьте, именно на NULL. Это как и использование EOF, не всегда же оно может рано быть -1, поэтому мы пишем не -1, а EOF
0
alex_x_x
бжни
2454 / 1659 / 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
2
Bers
Заблокирован
19.11.2011, 19:39 #19
Цитата Сообщение от Thinker Посмотреть сообщение
Поверьте, именно на NULL
На самом деле это важный момент. Потому что если проверка именно на NULL, значит NULL не всегда ноль, но всегда "не_валидный адрес".

Так получается?
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
19.11.2011, 19:39 #20
Цитата Сообщение от Bers Посмотреть сообщение
не сказать, что хорошо знаю стандарт, но помойму, там идёт проверка на ноль, а не на NULL
там оперируют словами null pointer, а NULL - const null pointer
1
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
19.11.2011, 19:45  [ТС] #21
Собственно, попробовал запустить этот код, компилятор (Qt'шный) не стал ругаться, программа отработала корректно.
Так где собака то зарыта?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.11.2011, 19:51 #22
Svinina, нигде, код абсолютно корректный
0
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
19.11.2011, 19:53  [ТС] #23
Ну Берс в самом начале написал, что такой код чреват ошибками.
Вот и интересуюсь, какими=)
1
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
19.11.2011, 19:54 #24
Цитата Сообщение от Bers Посмотреть сообщение
Нет никакой гарантии, что NULL - это ноль.
Есть гарантия, что NULL - это невалидный спецадрес, обозначающий, что указатель ни куда не указывает. И усматривают здесь изготовители не компиляторов, всё зависит от начального адреса памяти. На IBM совместимых это должен быть ноль, не зависимо от компиляторов и даже от языков, а сигнальные камни любят память с ноля начинать, а если так сделано, то NULL не имеет права быть нолём, опять таки даже в том случае, если кроскомпилятор прошивок таких коммутаторов выпустит мелкософт.
0
Bers
Заблокирован
19.11.2011, 19:57 #25
Цитата Сообщение от Svinina Посмотреть сообщение
Ну Берс в самом начале написал, что такой код чреват ошибками.
Вот и интересуюсь, какими=)

Первый раз delete освобождает память. С этого момента, этот кусок памяти становится "свободным". И система в любой миг может отдать его ещё кому нибудь.

Второй раз delete пытается освободить уже чужую память. И если эта память принадлежит уже кому то там - может произойти порча данных (хотя скорее всего система этот косяк пофиксит, и заломает накосячевший процесс)

Добавлено через 55 секунд
taras atavin, да я уже вразумел)

NULL всегда не_валидный адрес, но не всегда является нулём)
2
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
19.11.2011, 19:58 #26
Цитата Сообщение от Jupiter Посмотреть сообщение
в Си NULL это ноль приведенный к void* в C++ NULL это ноль
Не ноль, а невалидный номер байта. На IBM совместимых гарантировано невалидный номер байта - это ноль, но если сдеать c, или c++ кроскомпилятор для сиганального камня, то там может быть и другое значение NULL.
0
Bers
Заблокирован
19.11.2011, 20:00 #27
Цитата Сообщение от taras atavin Посмотреть сообщение
Не ноль, а невалидный номер байта.
Именно ноль, и если я правильно понял, именно из-за этого и был принят nullptr
(что бы различать int равный нулю и void* равный нулю)
0
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
19.11.2011, 20:01 #28
Цитата Сообщение от Bers Посмотреть сообщение
Говорят: пиши тогда уж просто ноль. Так будит безопаснее.
Опаснее. И именно потому, что NULL - это не всегда ноль.
0
Jupiter
19.11.2011, 20:25
  #29

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Второй раз delete пытается освободить уже чужую память. И если эта память принадлежит уже кому то там - может произойти порча данных (хотя скорее всего система этот косяк пофиксит, и заломает накосячевший процесс)
таки Bers прав, признаю свою ошибку в 22 посту

0
taras atavin
3888 / 1762 / 92
Регистрация: 24.11.2009
Сообщений: 27,565
19.11.2011, 20:40 #30
Цитата Сообщение от Bers Посмотреть сообщение
Гарантированно оно, если delete []a; a=0;
Не?
А если дефайн - никаких гарантий нет.
Наоборот. Если NULL!=0, то по
C++
1
2
a=0;
delete [a];
очень даже произойдёт. А если дефайном, то вопрос только в правильности дефайна, ну так не пользуйся не правильным и при любом значении NULL ничего не произойдёт. Кстати, я никогда не полагаюсь на проверку внутри delete, а всегда пишу явно
C++
1
2
3
4
if (p)
{
 delete [] p;
}
0
19.11.2011, 20:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2011, 20:40
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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