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

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

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

С похмелья голову заклинило

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

if(x) ? или как? Как проверить, удалён на данный момент указатель или нет?
P.S.: стыдно за вопрос ....

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 11:23
Ответы с готовыми решениями:

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

Как проверить в с++ пуст файл или нет?
Добрый день! Мне нужно написать программу, которая после открытия файла делает...

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

Как проверить число это или нет (Dev C++)????
Надо проверить число это или буквы при вводе с клавиатуры.

Как проверить, есть файл в папке или нет?
Как проверить существует файл в папке или нет? Условие. В файл будет...

26
Убежденный
Ушел с форума
Эксперт С++
16128 / 7275 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.06.2013, 11:27 2
Никак.
В этом беда "голых" указателей.
А вот у смартпоинтеров обычно есть что-нибудь в стиле weak_ptr.lock()...
1
igorrr37
1896 / 1505 / 758
Регистрация: 21.12.2010
Сообщений: 2,536
Записей в блоге: 10
07.06.2013, 11:27 3
после удаления обнуляй указатель, иначе не проверишь
1
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 11:34 4
Цитата Сообщение от FarStar Посмотреть сообщение
delete x;
- кто ж так удаляет экземпляр?Вызывай либо деструктор
x->~X();
либо предусмотри метод очистки
x->Free();
для поинтера мемори всегда будет ненулевой
0
-=ЮрА=-
Заблокирован
Автор 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;
}
1
Миниатюры
Как проверить, быль ли удалён указатель или нет?  
FarStar
Заблокирован
07.06.2013, 11:41  [ТС] 6
а если я напишу так:
delete x;
x = NULL;

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

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

Всё, всем спасибо и по плюсу, всем, кроме Юрца ))))) На самом деля я просто создал проект и пробежался дебагером по указателю .... чё может быть проще
0
-=ЮрА=-
Заблокирован
Автор 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;
}
1
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.06.2013, 12:00 12
-=ЮрА=-, Говорят же, после delete x.

C++
1
2
3
4
5
delete x;
x = NULL;
if (!x)
{
}
Деструктор объекта вызовется. Условие отработает.
0
CheshireCat
Эксперт С++
2913 / 1262 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
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++, то лучше использовать умные указатели, их в новом Стандарте пруд пруди.
0
Гром
211 / 130 / 28
Регистрация: 20.03.2009
Сообщений: 1,111
Записей в блоге: 16
Завершенные тесты: 1
07.06.2013, 12:00 14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
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
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.06.2013, 12:02 15
Гром,
Самостоятельно его не надо вызывать никогда!
Неверно. Есть один случай.
2
Croessmah
07.06.2013, 12:06
  #16

Не по теме:

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

1
Гром
211 / 130 / 28
Регистрация: 20.03.2009
Сообщений: 1,111
Записей в блоге: 16
Завершенные тесты: 1
07.06.2013, 12:08 17
ForEveR, спасибо, не знал.
0
FarStar
Заблокирован
07.06.2013, 12:15  [ТС] 18
Казалось бы, какой простой вопрос.... а сколько интереса у профессионалов
Цитата Сообщение от Croessmah Посмотреть сообщение
Гром, NULL не просто так придуман.
Я знаю, по этому под WinApi лучше ставить NULL, т.к. этот макрос в каких то случаях, я уж не помню, не равен нулю, тоесть я пишу NULL и не забочусь о том, должен быть ноль нулём или нет. Там чё то толи от версии винды, толи от компилятора зависит или ещё от чего ...
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 652
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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.
1
Гром
211 / 130 / 28
Регистрация: 20.03.2009
Сообщений: 1,111
Записей в блоге: 16
Завершенные тесты: 1
07.06.2013, 12:40 20
Цитата Сообщение от Croessmah Посмотреть сообщение
Гром, NULL не просто так придуман.
Кажется, Страуструп советовал использовать 0 вместо NULL. Точно уже не помню, но вроде могут быть какие-то мелкие проблемы с нуллом.
1
07.06.2013, 12:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2013, 12:40

Функции. Проверить, простое число или нет. Увеличить его значение на натуральное число M. Проверить, осталось ли оно простым
Помогите пожалуйста 1. Дано натуральное число N, проверить, простое оно или...

Существует указатель p. Можно ли выяснить, содержит он адрес допустимого значения или нет
если да, то как ?

Проверить,число введено или нет.
Ребята а как проверить ввел я число в массиве или символ???


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

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

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