Заблокирован

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

07.06.2013, 11:23. Показов 10643. Ответов 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
Заблокирован
07.06.2013, 12:41  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ForEveR Посмотреть сообщение
Possible definitions include 0 and 0L, but not (void*)0.
что то я не понял этой фразы. Так что, говорят, что возможно использовать 0 или 0L, тоесть возможно, но конкретно никто не рекомендует. Тоесть что лучше то юзать?

А but not (void*)0. это чё? Что я не могу указателю типа воид присвоить ноль?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.06.2013, 12:43
FarStar, NULL - implementation-defined. Возможные объявления включают
C++
1
2
#define NULL 0
#define NULL 0L
Но он точно не может быть:
C++
1
#define NULL (void*)0
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2013, 13:13
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

Миниатюры
Как проверить, быль ли удалён указатель или нет?  
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.06.2013, 13:27
-=ЮрА=-, 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;
}
2
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2013, 13:35
ForEveR, если прочтёшь внимательно найдёшь вот такие слова
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вызывай либо деструктор
x->~X();
либо предусмотри метод очистки
x->Free();
для поинтера мемори всегда будет ненулевой
- дальше была лишь попытка показать как всё можно соединить в одни шаблонный метод и использовать в программе для любого класса, не боясь что что-либо не обнулилось.

Не по теме:

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

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.06.2013, 13:37
-=ЮрА=-, Твоя попытка ведет к UB. Я тебе написал, как это должно выглядеть, чтобы не было 2 вызовов деструктора - это все.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.06.2013, 14:04
ForEveR, Да причём здесь UB Не UB?!Речь шла о том - что гораздо практичней создать метод по очистке памяти, а лучше шаблон, который ещё занулит указаетль. Вот запиши мой метод вот так и наслаждайся, сравни отработку кода выше и этого http://codepad.org/oQ7vxQwy
Если в проекте 40 классов гораздо удобней написать rset в каждом и 100% быть уверенным что после Free всё занулиться и вытреться из памяти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2013, 14:04

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

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

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

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

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


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

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

Новые блоги и статьи
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru