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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
FarStar
Заблокирован
07.06.2013, 11:23     Как проверить, быль ли удалён указатель или нет? #1
С похмелья голову заклинило

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

if(x) ? или как? Как проверить, удалён на данный момент указатель или нет?
P.S.: стыдно за вопрос ....
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14173 / 6188 / 981
Регистрация: 02.05.2013
Сообщений: 10,295
Завершенные тесты: 1
07.06.2013, 11:27     Как проверить, быль ли удалён указатель или нет? #2
Никак.
В этом беда "голых" указателей.
А вот у смартпоинтеров обычно есть что-нибудь в стиле weak_ptr.lock()...
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
07.06.2013, 11:27     Как проверить, быль ли удалён указатель или нет? #3
после удаления обнуляй указатель, иначе не проверишь
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 11:34     Как проверить, быль ли удалён указатель или нет? #4
Цитата Сообщение от FarStar Посмотреть сообщение
delete x;
- кто ж так удаляет экземпляр?Вызывай либо деструктор
x->~X();
либо предусмотри метод очистки
x->Free();
для поинтера мемори всегда будет ненулевой
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 11:38     Как проверить, быль ли удалён указатель или нет? #5
вот простой пример сшаблоном очистки
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;
}
Миниатюры
Как проверить, быль ли удалён указатель или нет?  
FarStar
Заблокирован
07.06.2013, 11:41  [ТС]     Как проверить, быль ли удалён указатель или нет? #6
а если я напишу так:
delete x;
x = NULL;

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

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вот простой пример сшаблоном очистки
а разве после команды delete для объекта деструктор автоматом не вызовется?
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 11:43     Как проверить, быль ли удалён указатель или нет? #7
Цитата Сообщение от FarStar Посмотреть сообщение
а потом буду проверять, мол если if(!x){ тогда значит он удалён :-) ?
нет это не так, можно тогда вообще написать x = NULL а память под внутренние переменные что сама по себе освободиться. По сути я думаю что delete в данном случае до одного места - он ничего не очищает. В правильных классах если есть работа с динамической памятью должен быть метод освобождения памяти либо деструктор
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
x->~X();
либо предусмотри метод очистки
x->Free();
FarStar
Заблокирован
07.06.2013, 11:46  [ТС]     Как проверить, быль ли удалён указатель или нет? #8
вопрос в том, что можно ли удалённому указатели присваивать какое - то значение, например NULL.
тоесть когда пишу после delete x; x = NULL, это корректно ? и удалённому указателю присвоится ноль?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.06.2013, 11:47     Как проверить, быль ли удалён указатель или нет? #9
-=ЮрА=-, Деструктор, да. 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. Но вообще, в С++, куда логичнее использовать умные указатели.
Указатель не является удаленным. Указатель он и в африке указатель. Вопрос лишь в том на что он указывает.
FarStar
Заблокирован
07.06.2013, 11:51  [ТС]     Как проверить, быль ли удалён указатель или нет? #10
Цитата Сообщение от ForEveR Посмотреть сообщение
FarStar, Если установить после удаления указатель в NULL/0/nullptr - можно будет проверить, что его адрес 0. Но вообще, в С++, куда логичнее использовать умные указатели.
просто у меня тут студия 2002 :-))))))))) там нет смартпоинтеров....
А Юра конечно был не прав, т.к. delete вызывает деструктор, а к примеру, delete[] вызовет деструктор для каждого объекта массива.

Всё, всем спасибо и по плюсу, всем, кроме Юрца ))))) На самом деля я просто создал проект и пробежался дебагером по указателю .... чё может быть проще
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 11:52     Как проверить, быль ли удалён указатель или нет? #11
Цитата Сообщение от 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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.06.2013, 12:00     Как проверить, быль ли удалён указатель или нет? #12
-=ЮрА=-, Говорят же, после delete x.

C++
1
2
3
4
5
delete x;
x = NULL;
if (!x)
{
}
Деструктор объекта вызовется. Условие отработает.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
07.06.2013, 12:00     Как проверить, быль ли удалён указатель или нет? #13
Вызов 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++, то лучше использовать умные указатели, их в новом Стандарте пруд пруди.
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
07.06.2013, 12:00     Как проверить, быль ли удалён указатель или нет? #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
template <class T>
void Free(T &x)
{
x.~T();
delete x;
x = NULL;
}

Не по теме:

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


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)
 //увы
А вообще, возможно вам имеет смысл действительно работать с умными указателями.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.06.2013, 12:02     Как проверить, быль ли удалён указатель или нет? #15
Гром,
Самостоятельно его не надо вызывать никогда!
Неверно. Есть один случай.
Croessmah
07.06.2013, 12:06
  #16

Не по теме:

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

Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
07.06.2013, 12:08     Как проверить, быль ли удалён указатель или нет? #17
ForEveR, спасибо, не знал.
FarStar
Заблокирован
07.06.2013, 12:15  [ТС]     Как проверить, быль ли удалён указатель или нет? #18
Казалось бы, какой простой вопрос.... а сколько интереса у профессионалов
Цитата Сообщение от Croessmah Посмотреть сообщение
Гром, NULL не просто так придуман.
Я знаю, по этому под WinApi лучше ставить NULL, т.к. этот макрос в каких то случаях, я уж не помню, не равен нулю, тоесть я пишу NULL и не забочусь о том, должен быть ноль нулём или нет. Там чё то толи от версии винды, толи от компилятора зависит или ещё от чего ...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.06.2013, 12:32     Как проверить, быль ли удалён указатель или нет? #19
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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2013, 12:40     Как проверить, быль ли удалён указатель или нет?
Еще ссылки по теме:

Функции. Проверить, простое число или нет. Увеличить его значение на натуральное число M. Проверить, осталось ли оно простым C++
Как проверить в с++ пуст файл или нет? C++
Как проверить, есть файл в папке или нет? C++

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

Или воспользуйтесь поиском по форуму:
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
07.06.2013, 12:40     Как проверить, быль ли удалён указатель или нет? #20
Цитата Сообщение от Croessmah Посмотреть сообщение
Гром, NULL не просто так придуман.
Кажется, Страуструп советовал использовать 0 вместо NULL. Точно уже не помню, но вроде могут быть какие-то мелкие проблемы с нуллом.
Yandex
Объявления
07.06.2013, 12:40     Как проверить, быль ли удалён указатель или нет?
Ответ Создать тему
Опции темы

Текущее время: 06:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru