Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 62, средняя оценка - 4.85
TimoshkaXXX
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
#1

Проверка выделена ли память под указатель - C++

27.05.2009, 16:16. Просмотров 9345. Ответов 13
Метки нет (Все метки)

Уважаемые программисты!!!!!
подскажите пожалуйста можно ли каким-либо способом проверить в условном операторе, выделена ли память под указатель
я пытался делать так:
C++
1
2
3
4
if (ptr == NULL)
{
    ptr = new ...//дальше выделяется память
}
но в этом случае выбрасывалось исключение типа access violation reading location типа того..
что мне делать скажите плиз!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2009, 16:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проверка выделена ли память под указатель (C++):

Почему указатель теряет свои значения после выхода с метода, память выделена динамически
#include <iostream> using namespace std; void sqr( int* a, int length );...

Ввод значения в переменную типа string, память под которую выделена динамически
Ребят, подскажите пожалуйста, как организовать ввод значения в переменную типа...

Функция, принимающая указатель и число байт и выделяющая память под указатель
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию,...

Как правильно удалять выделенную память под указатель на указатель?
есть код #include <iostream> #include <conio.h> #include <stdlib.h>...

Можно ли так выделить память в куче под указатель на массив?
Здравствуйте Можно ли выделить память в куче под указатель на массив...

По каким причинам память не может быть выделена динамически?
Что это могут быть за причины?

13
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
27.05.2009, 17:08 #2
Ты хоть исходник покажи. В общем случае так делать нельзя, потому как ptr у тебя может быть неинциализированным - т.е. там будут мусор, который не равен NULL, а ты в этом случае его будешь трактовать как нормальный указатель
0
TimoshkaXXX
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
27.05.2009, 17:40  [ТС] #3
а NULL тогда что такое??? мне непонятно.
0
Миниатюры
Проверка выделена ли память под указатель  
Mecid
680 / 229 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
27.05.2009, 18:57 #4
NULL это не на что не указывает
0
TimoshkaXXX
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
27.05.2009, 19:19  [ТС] #5
ясно а мою проблему можно как нибудь решить?
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
27.05.2009, 19:32 #6
Так ты ещё проблему не рассказал, а уже спрашиваешь, можно ли её решить
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
27.05.2009, 19:33 #7
Ты должен знать, что практика говорит: "после того, как удаляешь/освобождаешь что-то ставь указатель в NULL и будет тебе счастье". Даже если память под указатель не выделена, в область, все равно, можно писать/читать, если она валидна. Если ты сидишь под виндой, то там есть:
http://msdn.microsoft.com/en-us/library/aa366716(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa366713(VS.85).aspx
Как юзать - разберешься.
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
27.05.2009, 19:37 #8
Да неужто там никаких Watchpoint'ов нет?
0
Mecid
680 / 229 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
27.05.2009, 19:53 #9
это не проблема у тебя даже
тебе надо делать так
C
1
2
void* p=NULL;
p=malloc(size);
Добавлено через 6 минут 43 секунды
Перед использованием указателей им всегда нужно присваивать
значения. Если вы разыменовываете указатель, которому еще не
присвоено значение, то считанные из него данные могут представ-
лять собой случайные биты, а присваивание значения указываемому
элементу может затереть другие данные, вашу программу или даже
операционную систему. Это звучит несколько пугающе, но при опре-
деленной дисциплине такие вещи легко отслеживаются.
0
TimoshkaXXX
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
27.05.2009, 20:13  [ТС] #10
Mecid,
в том то и дело что в моей проге исользуется не "указатель которому еще не происвоено значение", а указатель под который не выделена память
проблема в том что мне нужно каким-то образом отслеживать обращения к указателю и, если он не инициализирован, то выделять память под него...
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
27.05.2009, 20:33 #11
TimoshkaXXX, либо ты делаешь как Mecid сказал, либо никак, можно конечно проверять VirtualQuery выделена ли виртуальная страница под этот адрес(вообще бредовая идея, во-первых мусор, во вторых освобождается ли страница при освобождении памяти), но всеже ничего логичнее чем присваивать NULL при инициализации и освобождении
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
27.05.2009, 22:07 #12
TimoshkaXXX,
вы определенно путаете инициализацию с выделением памяти.
Инициализация должна происходить при СОЗДАНИИ переменной/указателя.
А выделение памяти - в нужный момент.
Т.е., если вы создаете указатель(например, при создании класса), то ему СРАЗУ должен прискаиваться NULL.
А потом, при обращении, проверка: если NULL - то выделить память.
0
Mecid
680 / 229 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
27.05.2009, 22:31 #13
Цитата Сообщение от TimoshkaXXX Посмотреть сообщение
Mecid,
в том то и дело что в моей проге исользуется не "указатель которому еще не происвоено значение", а указатель под который не выделена память
проблема в том что мне нужно каким-то образом отслеживать обращения к указателю и, если он не инициализирован, то выделять память под него...
я чет не очень понял....может на коде покажешь
и ваще почитай про неинициализированные указатели
0
TimoshkaXXX
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
28.05.2009, 00:09  [ТС] #14
теперь кажется понятно что к чему спасибо!!!!!!)))))
0
28.05.2009, 00:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2009, 00:09
Привет! Вот еще темы с решениями:

Как передвигать указатель чтобы выделить память под новый элемент и добавить новый элемент в массив?
Допустим есть некое условие,нам нужно при каждом его выполнении выделить память...

Сырой указатель на память выделенную через new[]
Добрый вечер, подскажите правильную перегрузку для указателя на память...

Три непонятности: память в union, указатель на функцию и ->
Не пойму: 1) как в union по одному адресу хранят кучу разных переменных? 2)...

Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память
Читаю уроки по C++ на форуме, почему то автор не хочет все нормально писать, в...


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

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

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