Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2016, 16:29   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Ну если так рассуждать, есть функции проверки хипа - можно проверить является ли данная память выделенной или нет. Другое дело, что дело это неспешное и недокументериванное. Если использовать свои malloc/new то вообще плевое дело такую проверку сделать...
А смысл... проще инициализировать переменные
waleri вне форума Ответить с цитированием
Старый 09.12.2016, 18:56   #12
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от olej.tsil Посмотреть сообщение
Неправда.
Если выделение происходит new, то при невозможности возбуждается исключение (см. Б.Страуструпа объяснения).
Если выделение происходит, в стиле C, malloc() etc. - при невозможности возвращается NULL.
Это было бы хорошо, но увы, это не так.
new может ничего не сообщить,
а ошибка произойдет непосредственно
при обращении к памяти.
Таковы реалии. Другими словами,
уберечься от подобных ошибок просто нельзя.
Система может просто сказать что всё хорошо
и new завершиться вполне успешно.
Но потом нас ждет крах при определенных условиях.

Кстати, этот момент, емнип, также описан у Мейерса...
или у Саттера (), не помню уже.

Последний раз редактировалось Croessmah; 09.12.2016 в 20:51.
Croessmah вне форума Ответить с цитированием
Старый 09.12.2016, 19:36   #13
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Даже стало интересно у кого именно это описано.

У Герба Саттера в книге "Новые сложные задачи на C++".
Задача 23, вопрос 3 (для профессионалов): "Опишите реальные ситуации - в пределах стандарта C++ или вне его - когда проверка исчерпания памяти невозможна или бесполезна".

Ответ на этот приложу в скриншотах:
Безымянный_01.jpg
Безымянный_02.jpg
Безымянный_03.jpg
Безымянный_04.jpg
Безымянный_05.jpg
Безымянный_06.jpg

Последний раз редактировалось Croessmah; 09.12.2016 в 20:05.
Croessmah вне форума Ответить с цитированием
Старый 09.12.2016, 22:52   #14
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
new может ничего не сообщить,
а ошибка произойдет непосредственно
при обращении к памяти.
...
Система может просто сказать что всё хорошо
и new завершиться вполне успешно.
Но потом нас ждет крах при определенных условиях.
А какая разница?
Если мы подозреваем, что в некоторой ситуации может предполагаться ошибка выделения памяти - контролируйте исключения при new и при (хотя бы 1-м) обращении к объекту.
olej.tsil вне форума Ответить с цитированием
Старый 09.12.2016, 23:16   #15
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
что в некоторой ситуации может предполагаться ошибка выделения памяти - контролируйте исключения при new
Прочитайте еще раз. Система может удовлетворить любой запрос памяти.
Никакого исключения не будет. Система будет ждать обращения к памяти.
Яркий пример - Ubuntu с дефолтными настройками.
Цитата:
и при (хотя бы 1-м) обращении к объекту.
При обращении не будет исключения - будет символический segmentation fault (access memory violation).
Так что программа тупо упадет без всяких исключений.
Хотя платформозависимыми средствами можно поймать ошибку,
это выходит за рамки возможностей стандартных средств языка C++.
Поэтому, используя стандартные средства C++, контролировать это не получится.
Да и в случае падения мы не сможем ничего толком сделать.
Разве что сохранить какие-то данные о состоянии программы в момент падения.

Код:
try {
   int *p = new int [500100];//всё хорошо
   p[100500] = 666;//программа упала
} 
//...
catch (...) {
//...
}

Последний раз редактировалось Croessmah; 09.12.2016 в 23:35.
Croessmah вне форума Ответить с цитированием
Старый 10.12.2016, 10:00   #16
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Либо это дикое нарушение стандарта, либо вы скомпилировали свой код с настройками, запрещающими выкидывать exception в данной ситуации. В таком случае сами должны проверять на предмет p == 0.

Последний раз редактировалось waleri; 10.12.2016 в 10:03.
waleri вне форума Ответить с цитированием
Старый 10.12.2016, 13:26   #17
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Система может удовлетворить любой запрос памяти.
Никакого исключения не будет. Система будет ждать обращения к памяти.
Яркий пример - Ubuntu с дефолтными настройками.
Ещё один, более яркий пример - Fedora 23 с дефолтными настройками:
Код:
#include <iostream>
using namespace std;

int main( int argc, char* argv[] ) {
   unsigned long n = 10;
   while( true ) {
      n *= 10;
      cout << n;
      int *block;
      try {
         block = new int[ n ];
         cout << " +" << endl;
      }
      catch( std::bad_alloc ) {
         cout << " -" << endl;
         break;
      }
      delete [] block;
   }
}
Код:
[olej@dell errors]$ ./msize
100 +
1000 +
10000 +
100000 +
1000000 +
10000000 +
100000000 +
1000000000 +
10000000000 -
P.S. я специально показал прогон, а не умозрительные рассуждения...
olej.tsil вне форума Ответить с цитированием
Старый 10.12.2016, 16:10   #18
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Либо это дикое нарушение стандарта
Вы читали пост выше? Там об этом сказано.
Цитата:
запрещающими выкидывать exception в данной ситуации
Просто new не с состоянии быстро диагностировать ошибку.
Цитата:
В таком случае сами должны проверять на предмет p == 0.
Вы здесь видите nothrow версию?
Тем более, new может вернуть не ноль, но в результате крах по тем же причинам.
Цитата:
Fedora 23 с дефолтными настройками
Настройки памяти в студию.
Цитата:
Сообщение от olej.tsil Посмотреть сообщение
я специально показал прогон, а не умозрительные рассуждения...
Как доберусь до заданной машины - покажу.

Еще раз - диагностировать ошибку выделения памяти
может быть невозможно до момента непосредственного обращения.
Причины описаны в постах выше.

Последний раз редактировалось Croessmah; 10.12.2016 в 16:14.
Croessmah вне форума Ответить с цитированием
Старый 10.12.2016, 16:22   #19
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Просто new не с состоянии быстро диагностировать ошибку.
А медленно?
Цитата:
Сообщение от Croessmah Посмотреть сообщение
Причины описаны в постах выше.
Саттер, Александреску и пр. очень часто любят рассуждать умозрительно, теоретически ... но к поведению реальных операционных систем это, порой, имеет слабое отношение...
olej.tsil вне форума Ответить с цитированием
Старый 10.12.2016, 16:24   #20
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Причины описаны в постах выше.
Цитата:
Если на клетке с буйволом ты видишь табличку "Слон" - не верь глазам своим.
© Козьма Прутков
olej.tsil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив Указатель на указатель fr0st1k123 Общие вопросы C/C++ 3 27.12.2015 18:06
нужно написать программу в с++. определить длину строки и определить сколько раз встречается буква П в строке. chit Помощь студентам 4 11.07.2015 14:03
Передать указатель на указатель в функцию erro Общие вопросы C/C++ 3 29.10.2012 17:59
Определить сколько знаков в числе, вычислить сумму цифр и определить старшую цифру Blombox Помощь студентам 5 25.04.2011 15:52
Среди 20 введёных чисел определить чётные, распечатать их, определить min Spade Помощь студентам 4 15.06.2008 18:39