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

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

Войти
Регистрация
Восстановить пароль
 
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
#1

Не вызывается деструктор - C++

01.06.2013, 06:28. Просмотров 650. Ответов 11
Метки нет (Все метки)

_Здравствуйте. Я новичок в программировании, сейчас изучаю самостоятельно С++ по книге Джесса Либерти. При разборе одного из примеров передачи параметров в функцию как ссылок (с помощью указателей),столкнулся с тем, что в отличие от output в книге, у меня не выводится сообщение, которое прописано в деструкторе. Скажите плиз, в чем причина?
Код:

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
 // Передача константных указателей на объекты.
#include <iostream>
using namespace std;
 
class SimpleCat
{
public:
    SimpleCat();
    SimpleCat(SimpleCat&);
    ~SimpleCat();
 
    int GetAge() const { return itsAge; }
    void SetAge(int age) { itsAge = age; }
private:
    int itsAge;
};
 
SimpleCat::SimpleCat()
{
    cout << " SimpleCat constructor...\n";
    itsAge = 1;
}
 
SimpleCat::SimpleCat(SimpleCat&)
{
    cout << " SimpleCat copy constructor...\n"; 
}
 
SimpleCat::~SimpleCat()
{
    cout << " SimpleCat destructor...\n";
}
    
const SimpleCat * const FunctionTwo (const SimpleCat * const TheCat);
 
int main()
{
    cout << "\n\n";
    cout << " Making a cat...\n";
    SimpleCat Frisky;
    cout << " Frisky is " << Frisky.GetAge() << " years old\n";
    int age = 5;
    Frisky.SetAge(age); 
    cout << " Frisky is " << Frisky.GetAge() << " years old\n";
    cout << " Calling FunctionTwo...\n";
    FunctionTwo(&Frisky);
    cout << " Frisky is " << Frisky.GetAge() << " years old\n";
    cout << "\n\n";
    system ("pause");
    return 0;
}
 
const SimpleCat * const FunctionTwo (const SimpleCat * const TheCat)
{
    cout << " FunctionTwo returing...\n";
    cout << " Frisky is now " << TheCat->GetAge() << " years old\n";
    //TheCat->SetAge(8); const!
    return TheCat;
}
Результат:

Making a cat...
SimpleCat constructor...
Frisky is 1 years old
Frisky is 5 years old
Calling FunctionTwo...
FunctionTwo returing...
Frisky is now 5 years old
Frisky is 5 years old


Для продолжения нажмите любую клавишу . . .
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2013, 06:28     Не вызывается деструктор
Посмотрите здесь:

Не вызывается деструктор - C++
#include &lt;iostream&gt; using namespace std; class myclass { int a; public: myclass(); // конструктор ~myclass(); //...

Деструктор не вызывается - C++
В одном классе я создаю объект, и если проверку не проходит, я его возвращаю в другой метод, дабы у меня там начало всех начал,Главное...

Почему вызывается деструктор? - C++
Доброго времени суток. Написал такой код: struct O { virtual ~O() { cout &lt;&lt; &quot;hey&quot;; } }; struct...

Почему не вызывается деструктор? - C++
Всем доброго времени суток! Подскажите пожалуйста - почему не вызывается деструктор при выполнении строки 48? #include&lt;iostream&gt;...

Не вызывается деструктор структуры - C++
Создал класс. Членом класса является указатели на структуру, которая определена в классе. Поля структуры указатели, т.к. работа будет с...

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

Два раза вызывается деструктор - C++
Создал класс, в процессе выполнения программы вызвал деструктор, но когда программа завершается, деструктор вызывается повторно и вылетает...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
iifat
2219 / 1372 / 101
Регистрация: 05.06.2011
Сообщений: 3,771
01.06.2013, 08:17     Не вызывается деструктор #2
Дык рано ж. Он после нажатия на кнопку вызовется.
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 08:43  [ТС]     Не вызывается деструктор #3
_Вот я протупил... Я запускаю проги из под винды. Сейчас попробовал из под редактора. Нужная строка на выводе появилась. Спасибо, а то меня мучал этот вопрос.

Добавлено через 12 минут
_Ещё один вопрос касательно возврата указателей из функций. В строке 58 возвращается указатель TheCat без оператора разыменовывания. Т. е. якобы адрес, а не значение или объект по адресу. Нужно ли понимать так, что результат возврата фунцкции FunctionTwo можно записать так:

const SimpleCat * TheCat
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 09:23     Не вызывается деструктор #4

Не по теме:

Цитата Сообщение от NonCFist Посмотреть сообщение
по книге Джесса Либерти.
C++ за 21 день?
гореть в аду этой книге



Цитата Сообщение от NonCFist Посмотреть сообщение
Нужно ли понимать так, что результат возврата фунцкции FunctionTwo можно записать так
C++
1
2
SimpleCat obj;
const SimpleCat * TheCat = FunctionTwo (&obj);
Можно
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 09:31  [ТС]     Не вызывается деструктор #5
_Я уже встречал подобную реакцию на эту книгу, хотя пока и не понимаю почему... Во всяком случае решил для начала всё же одолеть её(а то на полпути бросать как-то некомильфо), а более глубоко изучать по другой литературе.
Croessmah
01.06.2013, 09:32
  #6

Не по теме:

Цитата Сообщение от NonCFist Посмотреть сообщение
хотя пока и не понимаю почему..
Цитата Сообщение от NonCFist Посмотреть сообщение
а более глубоко изучать по другой литературе.
собственно тогда и поймете почему

NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 09:38  [ТС]     Не вызывается деструктор #7
_А если функция была бы объявлена
const SimpleCat const FunctionTwo (const SimpleCat * const TheCat)

то тогда должно быть
return *TheCat.

Верно я понял?
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 09:39     Не вызывается деструктор #8
Цитата Сообщение от NonCFist Посмотреть сообщение
Верно я понял?
Да. Тогда на стеке создастся временная копия объекта
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 09:41  [ТС]     Не вызывается деструктор #9
Спасибо за пояснения. А каку литературу для начинающих можете присоветовать?
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
01.06.2013, 09:47     Не вызывается деструктор #10
Цитата Сообщение от NonCFist Посмотреть сообщение
Спасибо за пояснения.
только Вам еще нужно будет переделать конструктор копий под
C++
1
SimpleCat(const SimpleCat&);
Цитата Сообщение от NonCFist Посмотреть сообщение
А каку литературу для начинающих можете присоветовать?
На форуме тьма тем с обсуждениями. Например эти:
Лучшая книга по с++ для новичков
Посоветуйте литературу по C++ для новичка
если что, воспользуйтесь поиском. Так же есть тема со списком литературы:
Литература C++
NonCFist
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 12
01.06.2013, 09:59  [ТС]     Не вызывается деструктор #11
Дякую.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2013, 11:00     Не вызывается деструктор
Еще ссылки по теме:

Вызывается ли деструктор в данной программе? - C++
вызывается ли деструктор в данной программе и почему он не выводит на экран,что он выведен...?#include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Почему деструктор вызывается два раза - C++
Всем привет. Есть код, для примера #include &lt;vector&gt; using namespace std; struct AA { int n; AA() :n(0) { cout &lt;&lt;...

Не вызывается деструктор при работе с классом - C++
Здравствуйте! Не подскажете почему при работе с классом Деструктор не вызывается???? Вот код: #define _CRTDBG_MAP_ALLOC ...

Почему виртуальный деструктор вызывается дважды? - C++
Непонятно: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include&lt;string&gt; using namespace std; class base { ...

Деструктор вызывается до то возвращения значения из функции - C++
hi hi::operator+(const hi&amp; in) { struc * cur = last; struc *curs = in.last; hi out(&quot;0&quot;); int ost = 0, i = cur-&gt;a + curs-&gt;a...


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

Или воспользуйтесь поиском по форуму:
Гром
209 / 128 / 11
Регистрация: 20.03.2009
Сообщений: 1,101
Записей в блоге: 16
Завершенные тесты: 1
01.06.2013, 11:00     Не вызывается деструктор #12
На самом деле полностью конструктор копирования у вас должен иметь вид:
C++
1
2
3
4
5
SimpleCat::SimpleCat(SimpleCat& cat):
itsAge(cat.itsAge)
{
    cout << " SimpleCat copy constructor...\n"; 
}
Иначе ничего толкового он не сможет сделать.

Добавлено через 11 минут
Да, и в конструкторе по умолчанию тоже настоятельно рекомендую использовать список инициализации. Для int это может еще и ничего, а вот для более сложных типов это чревато излишними накладными расходами или и вовсе ошибками компиляции, т.к. запись типа
C++
1
2
3
4
Class1::Class1():
 {
 var1 = 1;
 }
эквивалентна записи
C++
1
2
3
4
5
6
7
Class1::Class1:
 var1()   //конструктор копирования все равно вызывается, если в классе, 
   //которому принадлежит var1 его нет, будет ошибка компиляции
 {
 var1 = 1;   //к уже сконструированной переменной-члену var1 применяется operator=,
   //что влечет дополнительные накладные расходы
 }
Присоединяюсь к мнению о предании забвению книг типа "[сделай то, чему умные люди посвящают годы] за 21 день". Лучше сделать это как можно раньше, чтобы потом не пришлось переучиваться. Как вариант, можно почитать Страуструпа - для изучения языка с нуля он, пожалуй, сложен, но коль скоро вы уже имеете навыки в работе с ним, вполне должны освоить.
Yandex
Объявления
01.06.2013, 11:00     Не вызывается деструктор
Ответ Создать тему
Опции темы

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