Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для dleen
65 / 3 / 0
Регистрация: 01.07.2014
Сообщений: 38

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

11.09.2014, 17:57. Показов 3060. Ответов 9
Метки нет (Все метки)

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

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: ...n\Documents\Visual Studio 2010\Projects\laba3\Debug\laba3.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\d bgdel.cpp
Line: 52

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Прервать Повтор Пропустить
---------------------------
В программе я создаю массив объектов используя вот такой конструктор:
код1
C++
1
2
3
4
5
6
7
8
9
10
11
12
Bus::Bus(char *pn, char ta, int nr, int kb, int zb, float vo, float vp) //конструктор с параметрами
{
    punktNaznachenija = new char[32];
 
    punktNaznachenija=pn;
    tipAvtobusa=ta;
    nomerReisa=nr;
    kolBiletov=kb;
    zenaBileta=zb;
    vremiaOtpravlenija=vo;
    vremiaPribitija=vp;
}
И вот такой деструктор:

код2
C++
1
2
3
4
Bus::~Bus() //деструктор
{ 
   delete [] punktNaznachenija; 
}

Обнаружил, что если закомментировать осовобождение выделенной под строку punktNaznachenija в деструкторе памяти, то ошибка винды при выходе из проги исчезает. Т.е. вот так работает без ошибок:
код3
C++
1
2
3
4
Bus::~Bus() //деструктор
{ 
   //delete [] punktNaznachenija; 
}
Вопрос: Почему возникает ошибка при выходе из программы и есть ли другие, отличные от код3, способы её устранения?

p.s. Если данных не достаточно могу выложить весь код программы. Он хоть и длинноват, около 300 строк... Но зато разбит на хэдер с описанием класса и две сpp-шки с описаниями методов и main-функции.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.09.2014, 17:57
Ответы с готовыми решениями:

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

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

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

9
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2014, 18:00
Цитата Сообщение от dleen Посмотреть сообщение
Почему возникает ошибка при выходе из программы
Гед-то память портится.

Добавлено через 1 минуту
Вот это что? Выделили память и тут же её потеряли?
Цитата Сообщение от dleen Посмотреть сообщение
C++
1
2
punktNaznachenija = new char[32];
punktNaznachenija=pn;
0
 Аватар для dleen
65 / 3 / 0
Регистрация: 01.07.2014
Сообщений: 38
11.09.2014, 18:05  [ТС]
Почему потерял? Выделил память и положил в неё значение pn. Ну по крайней мерее мне сейчас кажется что именно так и должно происходить. не?
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2014, 18:09
Цитата Сообщение от dleen Посмотреть сообщение
не?
Не. Выделили память под указатель (в указателе адрес начала памяти) и присвоили указателю другой адрес.

Добавлено через 2 минуты
Цитата Сообщение от dleen Посмотреть сообщение
Выделил память и положил в неё значение pn.
Если хотите строку в массив поместить, то нужно через strcpy().
0
 Аватар для dleen
65 / 3 / 0
Регистрация: 01.07.2014
Сообщений: 38
11.09.2014, 18:19  [ТС]
В конструкторе сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Bus::Bus(char *pn, char ta, int nr, int kb, int zb, float vo, float vp) //конструктор с параметрами
{
    pn = new char[32];
    punktNaznachenija=pn;
    tipAvtobusa=ta;
    nomerReisa=nr;
    kolBiletov=kb;
    count+=kolBiletov; //статическая переменная
    zenaBileta=zb;
    vremiaOtpravlenija=vo;
    vremiaPribitija=vp;
}
В деструкторе оставил вот так:
C++
1
2
3
4
Bus::~Bus() //деструктор
{ 
     delete [] punktNaznachenija; 
}
Ошибки при выходе из программы нет. Но чувствую что все равно где то накосячил

Добавлено через 6 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Если хотите строку в массив поместить, то нужно через strcpy().
Не, в массив не хочу. В переменную объекта я её помещаю. А уже потом из объектов массив собираю. Вот так вобщем в main всё выглядит:

C++
1
Bus b20[3]={ Bus("Berlin", 'A', 1, 50, 200, 11.11, 19.45), Bus("Moscow", 'A', 2, 50, 200, 19.46, 18.11), Bus("Moscow", 'C', 3, 50, 124, 11.11, 22.00) }; //создается массив объектов конструктором с параметрами
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
11.09.2014, 18:31
Цитата Сообщение от dleen Посмотреть сообщение
Но чувствую что все равно где то накосячил
Ага.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Bus::Bus(char const * pn, char ta, int nr, int kb, int zb, float vo, float vp) //конструктор с параметрами
{
    punktNaznachenija = new char[strlen(pn) + 1];
    strcpy(punktNaznachenija, pn);
 
    tipAvtobusa=ta;
    nomerReisa=nr;
    kolBiletov=kb;
    count+=kolBiletov; //статическая переменная
    zenaBileta=zb;
    vremiaOtpravlenija=vo;
    vremiaPribitija=vp;
}
Добавлено через 1 минуту
Цитата Сообщение от dleen Посмотреть сообщение
Не, в массив не хочу.
C-строка - это и есть массив.
Вообще, использование здесь std::string более уместно. Если предполагается работать со строкой как с объектом, а не как с массивом.
1
 Аватар для Справлюсь
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
11.09.2014, 18:34
вместо punktNaznachenija=pn; нужно strcpy(punktNaznachenija,pn);
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2014, 18:35
Цитата Сообщение от dleen Посмотреть сообщение
В переменную объекта я её помещаю.
Что помещаете? В параметрах указатель на строковый литерал, под этот указатель выделяете память (адрес строкового литерал при этом теряется), адрес пустой памяти заносите в punktNaznachenija.
Цитата Сообщение от alsav22 Посмотреть сообщение
Если хотите строку в массив поместить, то нужно через strcpy().
1
 Аватар для dleen
65 / 3 / 0
Регистрация: 01.07.2014
Сообщений: 38
11.09.2014, 19:11  [ТС]
DrOffset, да, так на много круче. Спасибо!

Аналогичный косяк я допустил и в конструкторе копий. Исправил. Работает. Но остался вопрос (см. строку 4. кода):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Bus::Bus (const Bus &object) //конструктор копии
{
//  punktNaznachenija = new char [32];                                   //было
    punktNaznachenija = new char [strlen(object.punktNaznachenija) +1];  //стало. но не уверен что правильно понимаю зачем тут +1. В object.punktNaznachenija у нас же уже есть нуль символ. Или он в strlen не считается ?
 
 
//  punktNaznachenija=object.punktNaznachenija;             //было
    strcpy (punktNaznachenija, object.punktNaznachenija);   //стало
    tipAvtobusa=object.tipAvtobusa;
    nomerReisa=object.nomerReisa;
    kolBiletov=object.kolBiletov;
    zenaBileta=object.zenaBileta;
    vremiaOtpravlenija=object.vremiaOtpravlenija;
    vremiaPribitija=object.vremiaPribitija;
}
Добавлено через 12 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Что помещаете? В параметрах указатель на строковый литерал, под этот указатель выделяете память (адрес строкового литерал при этом теряется), адрес пустой памяти заносите в punktNaznachenija.
Спасибо. Перечитаю сегодня раз 10 ваши слова, чтобы окончательно въехать. Но уже пора убегать. А то опоздаю туда куда спешу
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
11.09.2014, 19:16
Цитата Сообщение от dleen Посмотреть сообщение
Или он в strlen не считается ?
Да. Возвращает "чистую" длину строки, без учета нуль-символа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2014, 19:16
Помогаю со студенческими работами здесь

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

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

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

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

Ошибка в деструкторе
Всем привет. Пытаюсь написать что-то типа динамического массива строк, и все шло довольно хорошо пока не начал писать деструктор. ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru