Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/119: Рейтинг темы: голосов - 119, средняя оценка - 4.66
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Проверка выделения памяти указателей через оператор new

17.01.2015, 10:42. Показов 23502. Ответов 77
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И так есть некая структура, экземпляр которой определён как:
C++
1
var ***v;
Изначально заполняю экземпляр:
C++
1
2
3
4
5
6
7
8
9
v = new var**[1]; // создание 0-матрицы
if (v == NULL) // проверка выделения памяти для матрицы
    return -1;
v[0] = new var*[1]; // 0-массив
if (v == NULL)
    return -2;
v[0][0] = new var[3]; // 3 переменные
if (v == NULL)
    return -3;
В общем вопрос по двум проверкам (там где return -2 и -3), я честно говоря не понимаю как правильно написать условие проверки, т.е. явно что проверка "if (v == NULL)" не правильна, как сделать правильно?
Предполагаю что:
C++
1
2
3
4
5
6
v[0] = new var*[1]; // 0-массив
if (v[0] == NULL)
    return -2;
v[0][0] = new var[3]; // 3 переменные
if (v[0][0] == NULL)
    return -3;
Но мне кажется это не правильным, помогите поправить..
П.С. В дальнейшем естественно кол-во массивов и матриц будет больше 1, потому у меня сейчас сомнения того как правильно написать цикл проверки.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2015, 10:42
Ответы с готовыми решениями:

Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->?
#include <iostream> using namespace std; class random { public: void Set(int b){a=b;} int Get(){return a;} private: ...

Вопрос по поводу динамического выделения памяти и указателей
void buildArray(int *arr,int lenght) { int i; arr = (int*)malloc(lenght * sizeof(int)); arr = 1; arr = 2; arr = 3; ...

Передача массива указателей в функцию для выделения памяти
Есть функция, в которую передаются массивы указателей, для выделения памяти. void str_malloc(char** &strBol,char**...

77
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.01.2015, 18:10  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Nick Alte Посмотреть сообщение
new вообще ничего не возвратит
Ну это я образно сказал что NEW что то возвратит, это же не функция с return int
Имелось в виду что если уж new не сработает, то v = NULL будет, а значит правильный выход по return -1 (как у меня)...
В общем какой итог то данной темы? (или я тороплюсь и надо ещё дождаться нескольких ответов?)

1. Хотелось бы получить избежать использования try/catch/throw (и даже std::nothrow тоже, т.к. усложняет код!)
2. Может мне вообще тогда уж уйти в стандарт Си с использованием alloc? (я правда ещё не знаю с чем его едят, т.к. даже не пробовал)
3. Так как будет вообще правильно сделать?
4. Стоит ли написать собственную проверку на кол-во свободной памяти в соответствии с нужной перед использованием оп. New?
*Имею ввиду что возьму winapi функцию, посмотрю сколько там есть, сравню с тем сколько надо, и только если соответствие - то вызову new..

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
почитать про механизм исключений
Сижу читаю, нифига не понятно, т.к. не объясняется где и как что возникается и как это обойти. МСДН скуп, лишь пару фраз имеет, поисковик штрудирую..
Цитата Сообщение от Croessmah Посмотреть сообщение
Вам не понятно, это проблемы Ваши, а не языка.
Отсутствие логики в инструменте - это не моя проблема, а скорее кривой инструмент, imho)
Цитата Сообщение от Croessmah Посмотреть сообщение
пытаться доказать свою теорию
Да я не доказываю теорию, я просто хочу понять логически как это работает, но как то всё расплывчато в ответах, как и на МСДН.
0
 Аватар для saden
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
17.01.2015, 18:11
хочу писать по-русски, но не использовать русских букв и, желательно, знаков препинания...
Меняйте язык...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
17.01.2015, 18:11
Цитата Сообщение от Izual Посмотреть сообщение
1. Хотелось бы получить избежать использования try/catch/throw (и даже std::nothrow тоже, т.к. усложняет код!)
ответ: пост #9
Цитата Сообщение от Izual Посмотреть сообщение
2. Может мне вообще тогда уж уйти в стандарт Си с использованием alloc? (я правда ещё не знаю с чем его едят, т.к. даже не пробовал)
Ну если сможете потом вручную следить за вызовами конструкторов и деструкторов(для не POD типов), то можете.
Цитата Сообщение от Izual Посмотреть сообщение
3. Так как будет вообще правильно сделать?
с try/catch или как в посте #9
Цитата Сообщение от Izual Посмотреть сообщение
4. Стоит ли написать собственную проверку на кол-во свободной памяти в соответствии с нужной перед использованием оп. New?
Бесполезное занятие.
Цитата Сообщение от Izual Посмотреть сообщение
Отсутствие логики в инструменте - это не моя проблема, а скорее кривой инструмент, imho)
Логика проста - в случае ошибки передаем управление на более высокий уровень для обработки.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
17.01.2015, 18:22
Цитата Сообщение от Izual Посмотреть сообщение
Как она может быть?..
Тебя научить писать косячный код с ошибками времени выполнения?
Цитата Сообщение от Izual Посмотреть сообщение
создам проверку соответствия памяти
Что создашь?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.01.2015, 18:32  [ТС]
Цитата Сообщение от saden Посмотреть сообщение
Меняйте язык...
Я тут не троллингом занимаюсь, а ковырянием того почему что то может пойти не так.
Самый распространённый пример в интернете:
C++
1
2
3
4
5
6
7
8
try
  {
    int* myarray= new int[10000];
  }
  catch (std::bad_alloc& ba)
  {
    std::cerr << "bad_alloc caught: " << ba.what() << '\n';
  }
Типа 10000 переменных по 4 байта оперативка не выделит, меня это поводит в шок. Ладно бы написали что мол, если у вас меньше 40000 байт, то будет catch, но ведь не пишут, а значит спец. ограничение ставится почему то. А если мне надо 10000 переменных, и у меня памяти хватает, почему бы и не выделить... и по логике почему бы просто не прервать операцию выделения памяти и просто c NULL сравнить, но нет какие то bad_alloc, которые даже не описываются (ну пока что не нашёл откуда у них хвост).
Просто это не логично, вот и всё.

Добавлено через 7 минут
Цитата Сообщение от Enno Посмотреть сообщение
Что создашь?
То что написал выше в постах. Даже копипастну, не поленюсь:
Цитата Сообщение от Izual Посмотреть сообщение
*Имею ввиду что возьму winapi функцию, посмотрю сколько там есть, сравню с тем сколько надо, и только если соответствие - то вызову new..
Так ясно?..

В общем то тему можно закрывать, сделаю я так как в 9 посте сказали. Чую что кроме кошака мне тут больше ничего полезного ни кто не скажет. А дальнейшие разговоры ни к чему хорошему не приведут.

:lock:
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
17.01.2015, 18:33
Цитата Сообщение от Izual Посмотреть сообщение
Типа 10000 переменных по 4 байта оперативка не выделит, меня это поводит в шок.
Ты ещё скажи "А где main(), ошибки компиляции полезли, код нерабочий".
Не хочешь исключений? Хочешь проверку? Используй средства ОС!
0
 Аватар для saden
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
17.01.2015, 18:36
Ну если конструкция языка сама по себе бросает исключение, то как логично сделать?
Но Вы ж хотите не так, как предусмотренно самим языком. Что здесь логичного?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.01.2015, 18:44  [ТС]
Цитата Сообщение от saden Посмотреть сообщение
Но Вы ж хотите не так, как предусмотренно самим языком.
Его бог чтоли делал чтоб он был эталоном?..

Как я в общем и предполагал до этого, проверка на соответствие допустимой памяти решит вопрос с bad_alloc, т.к. это единственное разумное объяснение того, почему throw может возникнуть при вызове оператора new.
Хотя вопрос с 40'000 байт до сих пор мерцает как совершенно не логичный, т.к. не поставлено условие что допустимой памяти меньше 40000. Видимо значит надо покапаться в том почему этого условия нет, ушёл читать про alloc... может там что то есть.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
17.01.2015, 18:56
Цитата Сообщение от Izual Посмотреть сообщение
проверка на соответствие допустимой памяти решит вопрос с bad_alloc
Да ну ка?
1) Проверил память - хватает.
2) В это время другой процесс забирает себе всю доступную память.
3) Вы вызваете new, хватит ли памяти теперь? Может система решит этот вопрос, а может и нет.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
17.01.2015, 19:20
Цитата Сообщение от Izual Посмотреть сообщение
Его бог чтоли делал чтоб он был эталоном?..
Каким эталоном?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.01.2015, 19:44  [ТС]
Croessmah, во правильно мыслиш (ты прям как бальзам на душу, жаль только одно->), я этот момент уже написал в посте N15. Но не получил ответ на вопрос о том, чтоб как раз возможно было заблокировать другие процессы, т.е. чтоб между этими двумя моментами не было "прерывания" другого процесса.

Не по теме:

Добавлено через 1 минуту

Цитата Сообщение от Enno Посмотреть сообщение
Каким эталоном?
ты можеш больше не трудиться писать сюда, игнор полный в отношении тебя.

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
17.01.2015, 19:45
Цитата Сообщение от Izual Посмотреть сообщение
Croessmah, во правильно мыслиш
не дай Бог!

Нахрена вся эта канитель? Чем исключения или возврат нуля не устраивает?
0
 Аватар для saden
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
17.01.2015, 19:46
В защищенном режиме процессора для каждого процесса выделяется своя область памяти. Другие процессы память не заберут.
Если же пишете под старый ДОС, используйте запрет прерываний командой ассемблера.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.01.2015, 19:55  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Чем исключения или возврат нуля не устраивает?
Тем что сильно зашлаковывается код ненужными операторами, использование которых можно избежать. Я люблю чистый код, т.е. прям самое базовое апи, такое как в стандартном Си... просто радует глаз!

Добавлено через 6 минут
Вот чё нашёл:
Non-preemptive multitasking - невытесняющая многозадачность - это способ планирования процессов, при котором активный процесс выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст управление планировщику операционной системы для того, чтобы тот выбрал из очереди другой, готовый к выполнению процесс.
Наверное оно)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
17.01.2015, 19:56
Цитата Сообщение от Izual Посмотреть сообщение
использование которых можно избежать.
Не получится, проверку на успешное выделение, доступность необходимой памяти, всё равно придется делать.
Цитата Сообщение от Izual Посмотреть сообщение
такое как в стандартном Си...
тогда на Си и пишите. Только не забудьте сделать "лишнюю" проверку после malloc.
Цитата Сообщение от Izual Посмотреть сообщение
Я люблю чистый код, т.е. прям самое базовое апи
А кто мешает? Сейчас вся тема выглядит так - "Вы берете красные макасины, хотя Вам нравятся зеленые, которые также есть в наличии, а потом жалуетесь, что макасины красные".
Выбирайте средства и делайте. Не нравится стандартное - напишите своё, в чем проблема то?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.01.2015, 20:03  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы берете красные макасины, хотя Вам нравятся зеленые
Ну параллельно с Си ещё используются WinApi и Directx, а куда же без плюсов в таком случае... Да и есть моменты в плюсах действительно полезные, например недавно(относительно) познакомился с template, которые очень полезны оказались, и вроде более или менее эстетичны на мой вкус (ну тут даже роль сыграло то, что это очень помоглов решении нужной задачи, которую без шаблона решить было бы очень сложно).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.01.2015, 21:53
Цитата Сообщение от Nick Alte Посмотреть сообщение
Есть специальный способ вызова оператора new так, чтобы он не выбрасывал исключений при ошибках.
C++
1
2
3
void* myMemory = new(std::nothrow) char[1024];
if(myMemory == nullptr)
* * return -1;
К сожалению, прямо сейчас у меня нет возможности это проверить.

Вы не могли бы уточнить:

1.
Насколько я понял, есть operator new и есть операция new.
http://habrahabr.ru/post/185662/
Тогда:
C++
1
new(std::nothrow)
Это именно оператор? Или как?
std::nothrow - это имя объекта такое, смысли тут какая то перегрузка срабатывает?


2. Самое главное:
std::nothrow означает, что сама операция/оператор new не кидает своих исключений.

Но если я правильно понял, то это никак не распространяется на конструкторы аллоцируемых объектов.

Что произойдет, если:
C++
1
2
//some бросил исключение.
new(std::nothrow) some[1024];

Просто, если std::terminate, как в случае с noexcept, то это одно.
А если оно благополучно полетит назад по стеку - это другое.

Но в обоих случаях получается,
что единственный безопасный с точки зрения исключений способ работать с new - это ставить ловушки try/catch
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
17.01.2015, 22:02
Цитата Сообщение от hoggy Посмотреть сообщение
Это именно оператор? Или как?
это new-expression.
Операторы new/delete - Это вот эти функции: http://www.cplusplus.com/reference/new/

Цитата Сообщение от hoggy Посмотреть сообщение
std::nothrow - это имя объекта такое, смысли тут какая то перегрузка срабатывает?
extern const nothrow_t nothrow;

Цитата Сообщение от hoggy Посмотреть сообщение
Но если я правильно понял, то это никак не распространяется на конструкторы аллоцируемых объектов.
Конечно нет.
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
17.01.2015, 22:21
Цитата Сообщение от hoggy Посмотреть сообщение
std::nothrow - это имя объекта такое, смысли тут какая то перегрузка срабатывает?
Да, это объект-пустышка, позволяющий выбрать специальный вариант new при помощи перегрузки.
Цитата Сообщение от hoggy Посмотреть сообщение
что единственный безопасный с точки зрения исключений способ работать с new - это ставить ловушки try/catch
Зависит от конструируемых объектов.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
17.01.2015, 22:38
Цитата Сообщение от hoggy Посмотреть сообщение
Просто, если std::terminate, как в случае с noexcept, то это одно.
А если оно благополучно полетит назад по стеку - это другое.
5.3.4/18
If any part of the object initialization described above 75 terminates by throwing an exception and a suitable deallocation function can be found, the deallocation function is called to free the memory in which the object was being constructed, after which the exception continues to propagate in the context of the new-expression.
If no unambiguous matching deallocation function can be found, propagating the exception does not cause the object’s memory to be freed. [ Note: This is appropriate when the called allocation function does not allocate memory; otherwise, it is likely to result in a memory leak. — end note ]
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2015, 22:38

Ввод/вывод двумерного массива с использованием указателей и выделения памяти
Доброго времени суток. Такая проблема. Нужно написать программу с использованием функций для ввода/вывода двумерного массива с...

Проверка выделения памяти
Была функция: struct TreeNode *insert(struct TreeNode* rootPtr, int data) { if (rootPtr == NULL) { rootPtr = (struct...

Проверка выделения памяти
Алгоритм верен, все работает. Хочу проверять работу с памятью. т.е. проверять, что память действительно выделилась/освободилась. С...

Проверка возраста через оператор switch
Дан возраст человека мужского пола в годах. Вывести на экран возрастную категорию: до года – «младенец», от года до 11 лет – «ребенок», от...

Выделение памяти для массива через оператор new
Вопрос знатокам, объявляю глобальный статистический указатель static myStrucType* mas; надо для динамического массива, потом выделяю ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru