Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 18.01.2018
Сообщений: 10

Ошибка в деструкторе

10.02.2018, 23:55. Показов 3611. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Пытаюсь написать что-то типа динамического массива строк, и все шло довольно хорошо пока не начал писать деструктор.
Проблема в том, что деструктор отрабатыват нормально(в отладчике видно, что динамически выделенная память осободилась)
Но при выходе из мэйна выдает:

Debug Assertion Failed
Expression: __CrtisValidHeapPointer(block)

Предположение:Подозреваю, что удаляю в деструкторе что-то лишнее, в итоге программа при выходе пытается повторно очистить память, только в таком случае не понимаю что.

В общем прошу помочь кто-чем может.

Спасибо.

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
template<class Type> class DStringList 
{
private:
    int element_count = 0;
    struct DString
    {
        Type* string = NULL;
        DString* next_DString = NULL;
    };
 
    DString* FirstDString = NULL;
    DString* LastDString = NULL;
    
public:
    DStringList();
    ~DStringList();
 
    void add_string(Type* string);
    int get_elements_count(void) { return element_count; }
 
 
    Type *operator[](int index)
    {
        int i = 0;
        DString* start = NULL;
        for (start = FirstDString; start != NULL; start = start->next_DString)
        {
            if (i == index) break;
            i++;
        }
 
        return start->string;
    }
    
};
 
template<class Type> DStringList<Type>::DStringList()
{
}
 
template<class Type> DStringList<Type>::~DStringList() 
{
    DString* destructor_ptr;
 
    for (destructor_ptr = FirstDString; destructor_ptr != NULL; destructor_ptr = destructor_ptr->next_DString)
        delete[] destructor_ptr->string;
 
    for (destructor_ptr = FirstDString->next_DString; destructor_ptr != NULL; destructor_ptr = destructor_ptr->next_DString)
    {
        delete FirstDString;
        FirstDString = destructor_ptr;
    }
}
 
template<class Type> void DStringList<Type>::add_string(Type * string)
{
    int string_len = 0;
    for (string_len = 0; string[string_len] != '\0'; string_len++);
 
 
    DString* new_DString = new DString;
    if (FirstDString == NULL) FirstDString = new_DString;
 
    new_DString->string = new Type[string_len + 1];
 
    for (int i = 0; i < string_len; i++)
        new_DString->string[i] = string[i];
    new_DString->string[string_len] = '\0';
 
    if (LastDString != NULL)
        LastDString->next_DString = new_DString;
        
    LastDString = new_DString;
 
    element_count++;
}
 
 
 
 
 
int main(int argc, char** argv) {
    
    DStringList<WCHAR> list;
 
    list.add_string(L"Hello World");
    list.add_string(L"World Hello");
 
    wprintf(L"%d\n", list.get_elements_count());
    wprintf(L"%s\n", list[0]);
    wprintf(L"%s\n", list[1]);
    
    list.~DStringList();
    
 
    getchar();
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2018, 23:55
Ответы с готовыми решениями:

Ошибка в деструкторе
есть базовый абстрактный класс и есть производный от него: #ifndef EMPLOY_H #define EMPLOY_H class Employee { public: ...

Ошибка в деструкторе
Программа работает без ошибок и полный её код не выкладываю. Но при выходе из программы получаю вот такую ошибку: В программе я...

Ошибка в деструкторе
Когда удаляю объект класса hotel, в деструкторе вызывается delete для поля этого объекта - динамически созданного связного списка. И...

5
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
11.02.2018, 10:48
epitxx, с конца удаляй:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class Type> DStringList<Type>::~DStringList() 
{
    DString* destructor_ptr;
    if(FirstDString!=NULL){
        while (FirstDString!=LastDString){
            for (destructor_ptr=FirstDString; destructor_ptr->next_DString!=LastDString; destructor_ptr=destructor_ptr->next_DString);
            delete LastDString;
            LastDString=destructor_ptr;
        }
        delete LastDString;
    }
}
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.02.2018, 13:28
Цитата Сообщение от epitxx Посмотреть сообщение
C++
1
list.~DStringList();
Не нужно этого делать. Деструктор автоматически вызывается при выходе из области, где был создан list (main()).
0
0 / 0 / 0
Регистрация: 18.01.2018
Сообщений: 10
11.02.2018, 16:05  [ТС]
По поводу автоматического вызова деструктора верно, но возникает еще одна проблема.

Вот такой код:
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
WCHAR* l;
 
void Test()
{
    DStringList<WCHAR> list;
 
    list.add_string(L"Hello World");
    list.add_string(L"World Hello");
 
    wprintf(L"%d\n", list.get_elements_count());
    wprintf(L"%s\n", list[0]);
    wprintf(L"%s\n", list[1]);
 
    l = list[0];
    
    wprintf(L"Test l:%s\n", l);
    //list.~DStringList();
    wprintf(L"Test2 l:%s\n", l);
}
 
 
 
int main(int argc, char** argv) {
    
    Test();
 
    wprintf(L"Main l:%s\n", l);
 
    l[0] = 'A';
    l[1] = '\0';
 
    wprintf(L"Main l:%s\n", l);
 
    getchar();
}
При выходе из Test() деструктор действительно срабатывает, но я все еще могу обратиться к строке в структуре DString.

Вот результат работы:
2
Hello World
World Hello
Test l:Hello World
Test2 l:Hello World
Main l:??????????????
Main l:A
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.02.2018, 16:41
Цитата Сообщение от epitxx Посмотреть сообщение
При выходе из Test() деструктор действительно срабатывает, но я все еще могу обратиться к строке в структуре DString.
И что? delete, как известно, не удаляет, а ОСВОБОЖДАЕТ память: память помечается как свободная. Что там находится после этого - зависит от разного, и к самому освобождению памяти отношения не имеет.
1
0 / 0 / 0
Регистрация: 18.01.2018
Сообщений: 10
11.02.2018, 17:38  [ТС]
Тогда все прекрасно, большое спасибо за ответ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2018, 17:38
Помогаю со студенческими работами здесь

Классы - ошибка в деструкторе
У меня сейчас такое &quot;задание&quot;: опередить класс длинного целого числа (длинная арифметика), для сохранения которого необходимо использовать...

Ошибка при работе delete в деструкторе
enum place { first = 1, second }; class Passanger { public: Passanger(); void Call(); void PushButton(); int...

Ошибка в деструкторе или перегрузке оператора C++ ООП
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;windows.h&gt; using namespace std; ...

Возникает ошибка при удалении динамического массива символов в деструкторе класса
Всем привет. Есть приватная переменная, указатель на строку wchar_t *pUAgent; В конструкторе я ее инициализирую: pUAgent =...

При работе с free в деструкторе ошибка "Invalid address specified to RtlValidateHeap"
Доброго времени суток, господа эксперты и дамы эксперты. Объясните пожалуйста почему программа вылетает с ошибкой &quot;program.exe...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru