Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для broDiaga_cpp
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181

явный деструктор

07.04.2013, 20:43. Показов 2425. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TIMER {
public:
    TIMER()
    {
        std::cout << "constructor" << std::endl;
    }
     ~TIMER()
    {
        FILE_SINGLETON::Instance()->WriteData(4);    //нужная мне операция
        std::cout << "destructor" << std::endl;
    }
private:
    DWORD startTime;
    DWORD endTime;
};
По окончании работы программы операция выполняется 2 раза. 1й раз - при явном вызове, второй раз он сам делает. Почему?

Вот это я пишу в мэйне:
C++
1
2
TIMER tim;
tim.~TIMER();
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2013, 20:43
Ответы с готовыми решениями:

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Явный вызов деструктора
Добрый вечер всем! Я раньше читал статью о деструкторах, и там говорилось что можно явно вызвать деструктор. Статью я прочитал и забыл) И...

Явный и неявный конструктор
явный конструктор-это...? неявный конструктор-это...? спасибо.

9
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.04.2013, 20:54
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
TIMER tim;
tim.~TIMER();
Вы просто вызываете деструктор, а при завершении программы вызывается синтезируемый конструктор (он автоматически создается и всегда присутствует) и ваш явный конструктор.

Попробуйте не писать вторую строчку. Она не уничтожает объект.

Или как-то так:
C++
1
2
TIMER &tim = *new TIMER;
delete &tim;
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.04.2013, 09:49
Olivеr,
вызывается синтезируемый конструктор (он автоматически создается и всегда присутствует)
Чо? По выходу из области видимости вызывается деструктор объекта.
2 Автор, нет резона писать явный вызов деструктора, в основном явный вызов деструктора предназначен для работы с размещающим new/delete. В данном случае этого нет, потому просто уберите эту строчку.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 11:26
Цитата Сообщение от ForEveR Посмотреть сообщение
2 Автор, нет резона писать явный вызов деструктора, в основном явный вызов деструктора предназначен для работы с размещающим new/delete. В данном случае этого нет, потому просто уберите эту строчку.
то есть если написать delete в деструкторе, то можно не писать его в майне?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.04.2013, 11:33
programina, Уточните вопрос пожалуйста. Не совсем понял.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 11:42
Цитата Сообщение от ForEveR Посмотреть сообщение
programina, Уточните вопрос пожалуйста. Не совсем понял.
можно ли при создании класса с указателем обойтись без delete?
C++
1
2
3
4
5
6
7
8
9
10
class OB
{
~OB() { delete ? ; }
};
 
int main()
{
OB *ob = new OB;
 
// delete ob;
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
08.04.2013, 11:42
Цитата Сообщение от ForEveR Посмотреть сообщение
Olivеr, вызывается синтезируемый конструктор (он автоматически создается и всегда присутствует) Чо? По выходу из области видимости вызывается деструктор объекта.
2 Автор, нет резона писать явный вызов деструктора, в основном явный вызов деструктора предназначен для работы с размещающим new/delete. В данном случае этого нет, потому просто уберите эту строчку.
да. там опечатка. имелся в виду деструктор))
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.04.2013, 11:45
programina, Нет конечно. Я разве говорил об этом в своем посте? Теоретически это конечно возможно, однако не стоит использовать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
class C
{
public:
   ~C() { std::cout << "d-tor" << std::endl; operator delete(this); }
};
 
int main()
{
   C* c = new C();
   c->~C();
}
forever@pterois:~/My_pro1/cpp_pro$ valgrind ./new
==1698== Memcheck, a memory error detector
==1698== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==1698== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==1698== Command: ./new
==1698==
d-tor
==1698==
==1698== HEAP SUMMARY:
==1698== in use at exit: 0 bytes in 0 blocks
==1698== total heap usage: 1 allocs, 1 frees, 1 bytes allocated
==1698==
==1698== All heap blocks were freed -- no leaks are possible
==1698==
==1698== For counts of detected and suppressed errors, rerun with: -v
==1698== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 11:48
ForEveR, спасибо за уточнение
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
08.04.2013, 11:48
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
 
using namespace std;
 
class Foo
{
public:
    Foo(const string &_str): str(new string(_str)) {} //выделим память под новую строку
    ~Foo()
    {
        delete str; //это освободит память, выделенную под строку, и запустит деструктор класса string
        cout<<"Destructor";
    }
private:
    string *str;
};
int main()
{
    Foo *Obj = new Foo("Hello world");
    delete Obj; //это освободит память, выделенную под Obj, и запустит деструктор Foo для данного объекта
    return 0;
}
Цитата Сообщение от programina Посмотреть сообщение
можно ли при создании класса с указателем обойтись без delete?
не желательно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.04.2013, 11:48
Помогаю со студенческими работами здесь

Явный конструктор копирования в c++
Когда в программе нужен явный конструктор копирования?

Явный вызов деструктора
Есть класс Person, с полями string,string,long. Исходные данные хранятся в файле. Нужно сделать вектор объектов этого класса. ...

Явный вызов конструкторов перемещения
Для перемещения предлагается такая запись: TYPE a; TYPE b = std::move(a); Но при этом, если у объекта не задан конструктор...

Явный метод Эйлера для ОДУ
есть код #include&quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;fstream&gt; using namespace std; double const...

Явный вызов и объявление статических полей
1) Как сделать невозможным явный вызов деструктора и операторов? class MyClass { private : int _n; public : MyClass(int...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru