Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
Заблокирован

Как проверить, быль ли удалён указатель или нет?

07.06.2013, 11:23. Показов 10452. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С похмелья голову заклинило

X* x=new X();
delete x;

if(x) ? или как? Как проверить, удалён на данный момент указатель или нет?
P.S.: стыдно за вопрос ....
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2013, 11:23
Ответы с готовыми решениями:

Как через VkNet прочекать ID аккаунта удалён он или нет
Нужно через VkNet проверять ID удален ли аккаунт или нет. Но каким методом еффективно это делать я так и не понял

Как включить автосохранение проекта или проверить включено или нет?
как включить автосохранение проекта ? или проверить включено или нет ?

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

26
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.06.2013, 11:27
Никак.
В этом беда "голых" указателей.
А вот у смартпоинтеров обычно есть что-нибудь в стиле weak_ptr.lock()...
1
 Аватар для igorrr37
2889 / 2036 / 992
Регистрация: 21.12.2010
Сообщений: 3,787
Записей в блоге: 9
07.06.2013, 11:27
после удаления обнуляй указатель, иначе не проверишь
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2013, 11:34
Цитата Сообщение от FarStar Посмотреть сообщение
delete x;
- кто ж так удаляет экземпляр?Вызывай либо деструктор
x->~X();
либо предусмотри метод очистки
x->Free();
для поинтера мемори всегда будет ненулевой
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2013, 11:38
вот простой пример сшаблоном очистки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
template <class T>
void Free(T &x)
{
    x.~T();
    delete x;
    x = NULL;
}
 
class test
{
public:
      test(){}
     ~test(){}
};
 
int main()
{
    test * x = new test();
    Free(x);
    if(!x)
        cout<<"x - empty"<<endl;
    cin.get();
    return 0;
}
Миниатюры
Как проверить, быль ли удалён указатель или нет?  
1
Заблокирован
07.06.2013, 11:41  [ТС]
а если я напишу так:
delete x;
x = NULL;

а потом буду проверять, мол если if(!x){ тогда значит он удалён :-) ?

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот простой пример сшаблоном очистки
а разве после команды delete для объекта деструктор автоматом не вызовется?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2013, 11:43
Цитата Сообщение от FarStar Посмотреть сообщение
а потом буду проверять, мол если if(!x){ тогда значит он удалён :-) ?
нет это не так, можно тогда вообще написать x = NULL а память под внутренние переменные что сама по себе освободиться. По сути я думаю что delete в данном случае до одного места - он ничего не очищает. В правильных классах если есть работа с динамической памятью должен быть метод освобождения памяти либо деструктор
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
x->~X();
либо предусмотри метод очистки
x->Free();
0
Заблокирован
07.06.2013, 11:46  [ТС]
вопрос в том, что можно ли удалённому указатели присваивать какое - то значение, например NULL.
тоесть когда пишу после delete x; x = NULL, это корректно ? и удалённому указателю присвоится ноль?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.06.2013, 11:47
-=ЮрА=-, Деструктор, да. delete очищает память. Сначала зовет деструктор класса, потом очищает память (с помощью free или еще чего). А вот явный вызов деструктора должен производится только в одном случае - если мы работаем через размещающий new.
C++
1
2
3
4
5
6
7
template <class T>
void Free(T &x)
{
    x.~T();
    delete x;
    x = NULL;
}
Это кстати UB, ибо деструктор для объекта, для которого уже вызывался деструктор вызывается во время delete второй раз.

FarStar, Если установить после удаления указатель в NULL/0/nullptr - можно будет проверить, что его адрес 0. Но вообще, в С++, куда логичнее использовать умные указатели.
Указатель не является удаленным. Указатель он и в африке указатель. Вопрос лишь в том на что он указывает.
2
Заблокирован
07.06.2013, 11:51  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
FarStar, Если установить после удаления указатель в NULL/0/nullptr - можно будет проверить, что его адрес 0. Но вообще, в С++, куда логичнее использовать умные указатели.
просто у меня тут студия 2002 :-))))))))) там нет смартпоинтеров....
А Юра конечно был не прав, т.к. delete вызывает деструктор, а к примеру, delete[] вызовет деструктор для каждого объекта массива.

Всё, всем спасибо и по плюсу, всем, кроме Юрца ))))) На самом деля я просто создал проект и пробежался дебагером по указателю .... чё может быть проще
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2013, 11:52
Цитата Сообщение от FarStar Посмотреть сообщение
оесть когда пишу после delete x; x = NULL, это корректно ? и удалённому указателю присвоится ноль?
- нет!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
using namespace std;
 
template <class T>
void Free(T &x)
{
    x.~T();
    delete x;
    x = NULL;
}
 
class test
{
private :
    char * ptr;
public  :
      test();
     ~test();
     bool init();
     bool show();
};
 
test::test()
{
    ptr = NULL;
}
 
test::~test()
{
    if( ptr )
        delete [] ptr;
}
 
bool test::init()
{
    ptr = new char[8];
    bool bInit = ptr != NULL;
    if( bInit )
        strcpy(ptr, "test");
    return bInit;
}
 
bool test::show()
{
    bool bShow = ptr != NULL;
    if( bShow )
        cout<<ptr<<endl;
    return bShow;
}
 
int main()
{
    test * x = new test();
    test * y = x;
    x->init();
    x = NULL;
    y->show();
    if(!x)
        cout<<"x - empty"<<endl;
    cin.get();
    return 0;
}
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.06.2013, 12:00
-=ЮрА=-, Говорят же, после delete x.

C++
1
2
3
4
5
delete x;
x = NULL;
if (!x)
{
}
Деструктор объекта вызовется. Условие отработает.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
07.06.2013, 12:00
Вызов delete вызывает деструктор объекта. Если говорить о "плоских" указателях, то достаточно
C++
1
2
3
4
5
6
7
8
9
10
11
T* x = new T;
// работаем с объектом *x....
delete x;
x = NULL;
 
 
// где-то в другом месте:
if (!x)
{
    // объект был где-то удален
}
А вообще, если работаешь с C++, то лучше использовать умные указатели, их в новом Стандарте пруд пруди.
0
 Аватар для Гром
212 / 131 / 28
Регистрация: 20.03.2009
Сообщений: 1,123
Записей в блоге: 16
07.06.2013, 12:00
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
template <class T>
void Free(T &x)
{
x.~T();
delete x;
x = NULL;
}

Не по теме:

Люди, что ж вы делаете-то?=-O


delete всегда автоматически вызывает деструктор. Самостоятельно его не надо вызывать никогда!

Цитата Сообщение от FarStar Посмотреть сообщение
тоесть когда пишу после delete x; x = NULL, это корректно ? и удалённому указателю присвоится ноль?
Сначала очистится память, на которую указывал указатель (с самим указателем ничего не происходит, они в принципе мало информации содержат - обычно только адрес в памяти), а потом указателю присваивается нулевое значение.
Кстати, я лично предпочитаю не пользоваться макросом NULL, а писать непосредственно 0. В 11 стандарте есть еще более православная вещь - null_ptr.

В общем, вам нужно писать просто
C++
1
2
delete p;
p = 0;   //Или NULL если желаете
и потом проверять
C++
1
2
3
4
if (p)
 //значит, еще не удален
if (p == 0)
 //увы
А вообще, возможно вам имеет смысл действительно работать с умными указателями.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.06.2013, 12:02
Гром,
Самостоятельно его не надо вызывать никогда!
Неверно. Есть один случай.
2
07.06.2013, 12:06

Не по теме:

Гром, NULL не просто так придуман.
А nullptr совсем хорошая вещь :)

1
 Аватар для Гром
212 / 131 / 28
Регистрация: 20.03.2009
Сообщений: 1,123
Записей в блоге: 16
07.06.2013, 12:08
ForEveR, спасибо, не знал.
0
Заблокирован
07.06.2013, 12:15  [ТС]
Казалось бы, какой простой вопрос.... а сколько интереса у профессионалов
Цитата Сообщение от Croessmah Посмотреть сообщение
Гром, NULL не просто так придуман.
Я знаю, по этому под WinApi лучше ставить NULL, т.к. этот макрос в каких то случаях, я уж не помню, не равен нулю, тоесть я пишу NULL и не забочусь о том, должен быть ноль нулём или нет. Там чё то толи от версии винды, толи от компилятора зависит или ещё от чего ...
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.06.2013, 12:32
FarStar, WINApi не имеет никакого отношения к С++. Совсем. И NULL дефайнит очевидно не WINApi.
The macro NULL is an implementation-defined C++ null pointer constant in this International Standard
(4.10).193
193) Possible definitions include 0 and 0L, but not (void*)0.
1
 Аватар для Гром
212 / 131 / 28
Регистрация: 20.03.2009
Сообщений: 1,123
Записей в блоге: 16
07.06.2013, 12:40
Цитата Сообщение от Croessmah Посмотреть сообщение
Гром, NULL не просто так придуман.
Кажется, Страуструп советовал использовать 0 вместо NULL. Точно уже не помню, но вроде могут быть какие-то мелкие проблемы с нуллом.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2013, 12:40
Помогаю со студенческими работами здесь

Как проверить, на главной я или нет?
Как проверить на главной странице я или нет, тоесть есть ли что-то после / окончания домена

Как проверить checked или нет
Доброго времени суток подскажите как проверить отмечен или нет checkbox и отправить через GET &lt;script...

Как проверить, рабочий БП или нет?
как проверить рабочиё бп или нет. Заранее благодарен!!!

Как проверить запущенно ли приложение или нет?
Есть некоторый код, нужно сделать проверку процесса, если он существует, скопировать текст, если нет, открыть приложение и затем...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru