Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

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

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include <iostream> #include <conio.h> #include <stdlib.h> #include <time.h> using namespace std; void sort_1(const...

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

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

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

Сырой указатель на память выделенную через new[] - C++
Добрый вечер, подскажите правильную перегрузку для указателя на память выделенную через new #include <iostream> using namespace...

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

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

Выделение памяти под указатель - C++
Доброго времени суток. Возник такой вопрос: для любой программы, насколько мне известно, выделяется свой кусочек оперативной памяти. Когда...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.05.2009, 00:09
Ответ Создать тему
Опции темы

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