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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2016, 13:19   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию определить иницилизированый указатель

есть указатель
Код:
T *ptr_t;
где то в коде может произойти иницилизация
Код:
ptr_t = new T();
в прочем код проектировался так ,что при дальнейшем использовании указателя, не известно было ли выделение памяти. Программа может упасть.

Есть ли возможность, определить было ли выделение памяти?

так не получается:
Код:
if(ptr_t) // Указатель иницилизированый
читал что на NULL то же не дает 100% гарантии
SAMOUCHKA вне форума Ответить с цитированием
Старый 08.12.2016, 13:37   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
так не получается
Почему?

Цитата:
читал что на NULL то же не дает 100% гарантии
Гарантии от чего? Если указателю что-то присвоили, то он не nullptr. Если вы про случай, что после delete T; не написали T = nullptr это другой разговор и простыми проверками тут не помочь.
p51x вне форума Ответить с цитированием
Старый 08.12.2016, 13:45   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

точно знаю, что выделения памяти не было. НО!
Код:
if(ptr_t) // Если не было new, условие выполнятся не будет
{
    // Однако условие выполняется и программа падает
}
наверно нет способа определить, было ли выделение памяти. так как при объявлении нет иницилизации ни 0, ни NULL, ни nullptr. Указатель будет содержать какой то мусор

Последний раз редактировалось SAMOUCHKA; 08.12.2016 в 13:53.
SAMOUCHKA вне форума Ответить с цитированием
Старый 08.12.2016, 13:58   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
так как при объявлении нет иницилизации ни 0, ни NULL, ни nullptr. Указатель будет содержать какой то мусор
а разве это не само собой разумеющиеся?..
p51x вне форума Ответить с цитированием
Старый 08.12.2016, 15:39   #5
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
есть указатель
Код:
T *ptr_t;
где то в коде может произойти иницилизация
Код:
ptr_t = new T();
в прочем код проектировался так ,что при дальнейшем использовании указателя, не известно было ли выделение памяти. Программа может упасть.

Есть ли возможность, определить было ли выделение памяти?

так не получается:
Код:
if(ptr_t) // Указатель иницилизированый
читал что на NULL то же не дает 100% гарантии
1. При объявлении указателя вы его должны сами инициализировать нулём:
Код:
T *ptr_t = NULL;
2. А при new, если вы боитесь ошибки выделения памяти, вы должны ловить exeption;
3. И будет вам счастье проверки на NULL (т.е. "ещё не производилось выделени");
olej.tsil вне форума Ответить с цитированием
Старый 08.12.2016, 17:36   #6
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Используйте умный указатель.
А вот узнать была ли реально выделена память фактически невозможно,
до момента обращения, особенно на каких-нибудь x64 платформах.
Croessmah вне форума Ответить с цитированием
Старый 09.12.2016, 14:13   #7
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
А вот узнать была ли реально выделена память фактически невозможно,
Неправда.
Если выделение происходит new, то при невозможности возбуждается исключение (см. Б.Страуструпа объяснения).
Если выделение происходит, в стиле C, malloc() etc. - при невозможности возвращается NULL.
olej.tsil вне форума Ответить с цитированием
Старый 09.12.2016, 15:21   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

А если я просто указателю присвоил 0x11222342 ? Была ли выделена память?
p51x вне форума Ответить с цитированием
Старый 09.12.2016, 15:42   #9
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А если я просто указателю присвоил 0x11222342 ? Была ли выделена память?
Мы здесь будем бла-бла-бла? Или отвечать на вопрос ТС?

Если вы "просто указателю присвоил 0x11222342", константу, то если (до или после new) значение указателя равно константе 0x11222342 - то указатель не инициализировался.
olej.tsil вне форума Ответить с цитированием
Старый 09.12.2016, 16:09   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Мы здесь будем бла-бла-бла? Или отвечать на вопрос ТС?
Ну так правильные вопросы задаете, только не тому. ТС спросил: есть сферический указатель в вакууме (возможно после new, возможно неинициализированный, возможно тупо присвоена константа, ...), можно ли определить было ли реальное выделение памяти или нет.
Так что ваши вопросы надо вам задавать. Тему закрывать как решенную, а не оставлять вам для оффтопа.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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