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

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

07.06.2013, 11:23. Показов 10327. Ответов 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
2869 / 2016 / 991
Регистрация: 21.12.2010
Сообщений: 3,727
Записей в блоге: 15
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru