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

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

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

Не вызывается деструктор при работе с классом - C++

24.01.2014, 15:29. Просмотров 463. Ответов 11
Метки нет (Все метки)

Здравствуйте! Не подскажете почему при работе с классом Деструктор не вызывается????
Вот код:
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
#define _CRTDBG_MAP_ALLOC
#include<conio.h>
#include<fstream>
#include<crtdbg.h>
#include<iostream>
#include<cstring>
using namespace std;
 
 
class String1
    {
    private:
        char* str;
        ui length;
        static int number_Elem;
    public:
        String1(){str = NULL;length = 0;}
        String1(char* s)
        {
            length = strlen(s);//Получаем размер строки не учитывая 0 - вого байта
            
                       
            str    = new char[length + 1];//c учетом нулевого байта
            for(ui i(0); i < length; i++)
            {
                str[i] = s[i];
            }
            str[length] = '\0';
 
        }
        //Конструктор копирования. Он копирует объект класса стринг в объект класса стринг
        String1(const String1& s)
        {
            length = strlen(s.str);//Получаем размер строки не учитывая 0 - вого байта
            str    = new char[length + 1];//c учетом нулевого байта
            for(ui i(0); i < length; i++)
            {
                str[i] = s.str[i];
            }
            str[length] = '\0';
        }
        
        friend ostream& operator<<(ostream& os,String1& s)
        {
            os << s.str;
            return os;
        }   
        /*void Free()
        {
            delete[] str;           
        }*/
        ~String1()
        {
            delete[] str;
        }
    };
 
int main()
{
 
setlocale(LC_ALL, "Russian");
 
 
        String1 str("Hello");
    String1 str2(str);
cout << str2 <<endl;
 
_getch();
    _CrtDumpMemoryLeaks();
 
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2014, 15:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не вызывается деструктор при работе с классом (C++):

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О - C++
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

Ошибка при работе с абстрактным классом pair - C++
Всем доброго времени суток, стоит задача создать абстрактный класс pair и создать от него производный класс complex, определив при этом...

Не вызывается деструктор - C++
_Здравствуйте. Я новичок в программировании, сейчас изучаю самостоятельно С++ по книге Джесса Либерти. При разборе одного из примеров...

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

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

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

11
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.01.2014, 15:34 #2
Uho,
Цитата Сообщение от Uho Посмотреть сообщение
Не подскажете почему при работе с классом Деструктор не вызывается????
откуда такая уверенность ?)
0
egor2116
340 / 371 / 42
Регистрация: 20.01.2013
Сообщений: 1,127
24.01.2014, 15:34 #3
Здравствуйте! Не подскажете почему при работе с классом Деструктор не вызывается????
А как вы это определили ?
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.01.2014, 15:36 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        ~String1()
        {
cout<<"Destructor"<<endl;
            delete[] str;
        }
    };
 
int main()
{
 
setlocale(LC_ALL, "Russian");
 
 {
        String1 str("Hello");
    String1 str2(str);
cout << str2 <<endl;
 }
_getch();
    _CrtDumpMemoryLeaks();
 
return 0;
}
Добавлено через 31 секунду
вот такие изменения внесите и попробуйте
0
Uho
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
24.01.2014, 15:38  [ТС] #5
Да дело в том, что память не освобождается(((?
0
iDeveloper
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
24.01.2014, 15:41 #6
он вызывается. Добавьте в определение деструктора вывод сообщения. а в main() создайте обэкты в дополнительных фигурных скобках:

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
 
   setlocale(LC_ALL, "Russian");
 
   {
      String1 str("Hello");
      String1 str2(str);
   }
_getch();
return 0;
}
Добавлено через 2 минуты
как вы определили, что память не освобождается?
0
Uho
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
24.01.2014, 15:47  [ТС] #7
А вон как. Спасибо ребят!!!

Добавлено через 2 минуты
А я вызвал вот такую функцию
C++
1
 _CrtDumpMemoryLeaks();
Но прежде чем ее вызывать необходимо там где инклуды макроопределить вот такое:
C++
1
#define _CRTDBG_MAP_ALLOC
Добавлено через 2 минуты
И после выполнения программы вы увидите сообщение где вывод такого плана
XML
1
2
3
4
5
6
7
Класс Book.exe" (Win32). Загружено "C:\Users\Илюха\Documents\Visual Studio 2012\Projects\Класс Book\Debug\Класс Book.exe". Символы загружены.
"Класс Book.exe" (Win32). Загружено "C:\Windows\SysWOW64\ntdll.dll". Невозможно найти или открыть PDB-файл.
"Класс Book.exe" (Win32). Загружено "C:\Windows\SysWOW64\kernel32.dll". Невозможно найти или открыть PDB-файл.
"Класс Book.exe" (Win32). Загружено "C:\Windows\SysWOW64\KernelBase.dll". Невозможно найти или открыть PDB-файл.
"Класс Book.exe" (Win32). Загружено "C:\Windows\SysWOW64\msvcp110d.dll". Символы загружены.
"Класс Book.exe" (Win32). Загружено "C:\Windows\SysWOW64\msvcr110d.dll". Символы загружены.
Программа "[5564] Класс Book.exe" завершилась с кодом 0 (0x0).
если происх. утечка памяти, то появляется и такое:

XML
1
2
3
4
5
6
7
Detected memory leaks!
Dumping objects ->
{337} normal block at 0x0036AFE0, 6 bytes long.
 Data: <Hello > 48 65 6C 6C 6F 00 
{336} normal block at 0x00369BF8, 6 bytes long.
 Data: <Hello > 48 65 6C 6C 6F 00 
Object dump complete.
1
Uho
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
27.03.2014, 17:40  [ТС] #8
Такая беда при работе с QT: range-based 'for' loops are not allowed in C++98 mode
при компиляции, как исправить?
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void MainWindow::PrintDir(const QString& filePath)
{
    QDir mDir(filePath);
    QString buffer;
    //entryInfoList() возвращает список файлов в директории
    //элементом этого односвязанного списка является QFileinfo
    for( QFileInfo temp : mDir.entryInfoList() )//цикл на диапазоне(проходит каждый элемент данного списка)
    {
        //absoluteFilePath(): Директория того файла, который мы сейчас смотрим
        buffer += temp.absoluteFilePath() + '\n';//т.е мы проходим цикл и смотрим дирректорию каждого файла
    }
    ui->textEdit->setText(buffer);
}
Проблема кроется в цикле for()????????????????????????????????
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2014, 18:11 #9
Цитата Сообщение от Uho Посмотреть сообщение
Проблема кроется в цикле for()????????????????????????????????
Проблема в излишнем кол-ве вопросительных знаков.
Цитата Сообщение от Uho Посмотреть сообщение
как исправить?
Использовать стандарт C++11. Или заменить на классический for.
0
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 592
27.03.2014, 18:18 #10
Uho, очевидно ведь, что в C++98 нету range based for. Это вам не джава и не С++11
0
Uho
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 9
27.03.2014, 18:34  [ТС] #11
Так что делать то надо, чтобы исправить? Я просто впервые с QT, и впервые сталкиваюсь с проблемой?!
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.03.2014, 10:26 #12
Цитата Сообщение от Uho Посмотреть сообщение
Так что делать то надо, чтобы исправить? Я просто впервые с QT, и впервые сталкиваюсь с проблемой?!
сделать for "классическим", у Вас он написан в соответствии со стандартом с++11, а Ваш компилятор его не поддерживает
0
28.03.2014, 10:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 10:26
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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