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

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

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

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

if(x) ? или как? Как проверить, удалён на данный момент указатель или нет?
P.S.: стыдно за вопрос ....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 11:23     Как проверить, быль ли удалён указатель или нет?
Посмотрите здесь:

C++ Проверить,число введено или нет.
как проверить число на то, является ли оно им или нет C++
C++ Как проверить нулевой ли указатель?
C++ Как проверить число это или нет (Dev C++)????
C++ при вводе из файла проверить следующая строка пустая или нет
C++ Существует указатель p. Можно ли выяснить, содержит он адрес допустимого значения или нет
C++ Как проверить пустой файл или нет?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FarStar
Заблокирован
07.06.2013, 12:41  [ТС]     Как проверить, быль ли удалён указатель или нет? #21
Цитата Сообщение от ForEveR Посмотреть сообщение
Possible definitions include 0 and 0L, but not (void*)0.
что то я не понял этой фразы. Так что, говорят, что возможно использовать 0 или 0L, тоесть возможно, но конкретно никто не рекомендует. Тоесть что лучше то юзать?

А but not (void*)0. это чё? Что я не могу указателю типа воид присвоить ноль?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
07.06.2013, 12:43     Как проверить, быль ли удалён указатель или нет? #22
FarStar, NULL - implementation-defined. Возможные объявления включают
C++
1
2
#define NULL 0
#define NULL 0L
Но он точно не может быть:
C++
1
#define NULL (void*)0
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 13:13     Как проверить, быль ли удалён указатель или нет? #23
1-е говорил я прибилизительно о таком случае
(т.е написали класс, деструктор не сделали либо сделали бездумно и про очистку забыли, можно раскоментить деструктор, а у нас так добрая половина форума пишет) как и говорил - алокнутая мемори при неправильном либо отсутсвующем деструкторе никуда не денется - это я о
C++
1
cout<<ptr<<endl;
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
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
using namespace std;
 
class test
{
private :
    char * ptr;
public  :
      test();
     //~test();
     bool init();
     bool init(const char *str);
     bool show();
     void rset();
     char * pointer(){return ptr;};
};
 
test::test()
{
    ptr = new char[8];
}
 
/*test::~test()
{
    //
}*/
 
bool test::init()
{
    bool bInit = ptr != NULL;
    if( bInit )
        strcpy(ptr, "test");
    return bInit;
}
 
bool test::init(const char * str)
{
    bool bInit = str != NULL;
    if( bInit )
        strcpy(ptr, str);
    return bInit;
}
 
bool test::show()
{
    bool bShow = ptr != NULL;
    if( bShow )
        cout<<ptr<<endl;
    return bShow;
}
 
void test::rset()
{
    if( ptr )
        delete [] ptr;
}
 
int main()
{
    test * x = new test();
    test * y = x;
    x->init("bla bla");
    x->show();
    char * ptr = x->pointer();
    x->~test();
    x->~test();
    delete x;
    x = NULL;
    cout<<ptr<<endl;
    if(!x)
        cout<<"x - empty"<<endl;
    cin.get();
    return 0;
}
http://codepad.org/1Fj6Mhjr

2-е на счёт деструктора вызывать его можно - это такой же метод как и все остальные,
если написан умно то его вызов хоть 200 раз ни к чему ужастному кроме как очистке памяти и обнулению объектов не приведёт (конечно же для существующего объекта)

Смысл того что я закладывал свой ответ сводился к такому
Если пишем классы работающие с памятью то лучше предусмотреть спец метод по очистке памяти, а не делать чистку в деструкторе. Этими же методами можно будет производить "перезапуск класса" посредством очистки старой мемори и выдления новой в методе инициализации.
Я предпочитаю писать с явным членом класса а не динамическим. Тогда нет никаких двусмысленностей и прочих ньюансов.
Некотрые ответы в данной теме меня явно позабавили. Кроме цели помочь я ничего не приследовал, не понятен мой ход мыслей и кажется неверным - ну ок. Я решил написать, а то не дай бог кто то тут за слив посчитает моё выполнение рабочих обязанностей в результате чего пишу с задержкой.

Не по теме:

ЗЫ На счёт NULL - вот что это за деф в студии

C++
1
2
3
4
5
6
7
8
9
/* Define NULL pointer value */
 
#ifndef NULL
#ifdef  __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

Миниатюры
Как проверить, быль ли удалён указатель или нет?  
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
07.06.2013, 13:27     Как проверить, быль ли удалён указатель или нет? #24
-=ЮрА=-, UB есть UB. Программа, содержащая UB не является well-formed программой.
Once a destructor is invoked for an object, the object no longer exists; the behavior is undefined if the
destructor is invoked for an object whose lifetime has ended (3.8). [ Example: if the destructor for an
automatic object is explicitly invoked, and the block is subsequently left in a manner that would ordinarily
invoke implicit destruction of the object, the behavior is undefined. — end example ]
Если так хочется вызывать явно деструктор, то Free стоит переделать так
C++
1
2
3
4
5
6
7
template<typename T>
void Free(T*& x)
{
   x->~T();
   operator delete(x);
   x = NULL;
}
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 13:35     Как проверить, быль ли удалён указатель или нет? #25
ForEveR, если прочтёшь внимательно найдёшь вот такие слова
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вызывай либо деструктор
x->~X();
либо предусмотри метод очистки
x->Free();
для поинтера мемори всегда будет ненулевой
- дальше была лишь попытка показать как всё можно соединить в одни шаблонный метод и использовать в программе для любого класса, не боясь что что-либо не обнулилось.

Не по теме:

Ладно ForEveR, у меня есть работа и 2 заказа фриланса + ещё два преокта на послеоплатной поддержке, с топиком уже давно всё ясно и так у меня нет времени на разговоры о чём я и так имею представление.

ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
07.06.2013, 13:37     Как проверить, быль ли удалён указатель или нет? #26
-=ЮрА=-, Твоя попытка ведет к UB. Я тебе написал, как это должно выглядеть, чтобы не было 2 вызовов деструктора - это все.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2013, 14:04     Как проверить, быль ли удалён указатель или нет?
Еще ссылки по теме:

C++ Проверить, является ли последовательность прогрессией или нет?
Проверить, правильно ли в текст входят круглые скобки. Ответ ДА или НЕТ с++ C++
Как проверить в с++ пуст файл или нет? C++
Как проверить, есть файл в папке или нет? C++
Как проверить на какой класс ссылается указатель? C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
07.06.2013, 14:04     Как проверить, быль ли удалён указатель или нет? #27
ForEveR, Да причём здесь UB Не UB?!Речь шла о том - что гораздо практичней создать метод по очистке памяти, а лучше шаблон, который ещё занулит указаетль. Вот запиши мой метод вот так и наслаждайся, сравни отработку кода выше и этого http://codepad.org/oQ7vxQwy
Если в проекте 40 классов гораздо удобней написать rset в каждом и 100% быть уверенным что после Free всё занулиться и вытреться из памяти.
Yandex
Объявления
07.06.2013, 14:04     Как проверить, быль ли удалён указатель или нет?
Ответ Создать тему
Опции темы

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