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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
#1

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

07.04.2013, 20:43. Просмотров 758. Ответов 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();
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2013, 20:43     явный деструктор
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
07.04.2013, 20:54     явный деструктор #2
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
TIMER tim;
tim.~TIMER();
Вы просто вызываете деструктор, а при завершении программы вызывается синтезируемый конструктор (он автоматически создается и всегда присутствует) и ваш явный конструктор.

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

Или как-то так:
C++
1
2
TIMER &tim = *new TIMER;
delete &tim;
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.04.2013, 09:49     явный деструктор #3
Olivеr,
вызывается синтезируемый конструктор (он автоматически создается и всегда присутствует)
Чо? По выходу из области видимости вызывается деструктор объекта.
2 Автор, нет резона писать явный вызов деструктора, в основном явный вызов деструктора предназначен для работы с размещающим new/delete. В данном случае этого нет, потому просто уберите эту строчку.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 11:26     явный деструктор #4
Цитата Сообщение от ForEveR Посмотреть сообщение
2 Автор, нет резона писать явный вызов деструктора, в основном явный вызов деструктора предназначен для работы с размещающим new/delete. В данном случае этого нет, потому просто уберите эту строчку.
то есть если написать delete в деструкторе, то можно не писать его в майне?
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.04.2013, 11:33     явный деструктор #5
programina, Уточните вопрос пожалуйста. Не совсем понял.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 11:42     явный деструктор #6
Цитата Сообщение от 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;
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
08.04.2013, 11:42     явный деструктор #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Olivеr, вызывается синтезируемый конструктор (он автоматически создается и всегда присутствует) Чо? По выходу из области видимости вызывается деструктор объекта.
2 Автор, нет резона писать явный вызов деструктора, в основном явный вызов деструктора предназначен для работы с размещающим new/delete. В данном случае этого нет, потому просто уберите эту строчку.
да. там опечатка. имелся в виду деструктор))
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.04.2013, 11:45     явный деструктор #8
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)
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.04.2013, 11:48     явный деструктор #9
ForEveR, спасибо за уточнение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 11:48     явный деструктор
Еще ссылки по теме:

Компилятор игнорирует явный конструктор копирования - C++
Уже в который раз возникают проблемы с конструкторами класса и вот очередная из них. Насколько я понял, компилятор игнорирует явно...

Как использовать явный конструктор родительского класса? - C++
Привет :) Вот код, строчка 43. Как использовать конструктор типа A(int), в классе C? Компилятор выдаёт ошибку (Error:...

Объясните, зачем в коде нужен явный конструктор копирования - C++
Добрый день, хочу понять код, почему тут обезательно надо явный конструктор копирования? #include &lt;iostream&gt; using namespace...

Деструктор - C++
Ребята, объясните, пожалуйста, где, как и когда в программе вызывается деструктор? Вот мой пример: #include &lt;iostream&gt; using namespace...

Деструктор - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #define _CRTDBG_MAP_ALLOC #include &lt;crtdbg.h&gt; using namespace std; class list{ ...


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

Или воспользуйтесь поиском по форуму:
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
08.04.2013, 11:48     явный деструктор #10
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?
не желательно
Yandex
Объявления
08.04.2013, 11:48     явный деструктор
Ответ Создать тему
Опции темы

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