Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Генрисон
4 / 3 / 1
Регистрация: 30.10.2012
Сообщений: 349

При вызове деструктора вылазит ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

28.04.2015, 11:06. Показов 980. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Понимаю,что подобный вопрос на форуме поднимался не раз,но разобраться не могу всё равно.
Вот описание класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Stroka
{
protected:
    char *pCh;      //Указатель на массив символов
    int len;                //длина строки
public: 
    Stroka();                                 //конструктор без параметров
    Stroka(const char*);                        //конструктор,который в качестве параметра принимает Си-строку
    Stroka(Stroka &);                  //конструктор копирования
    ~Stroka();                               //деструктор
    char *GetStr(void);                 
    int GetLen(void);                         //проверка,пуста ли строка
    void Print(void);                          //вывод строки на экран
};
Вот описание всех функций-членов:
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
char* Stroka::GetStr(void)
{
    return pCh;
}
int Stroka::GetLen(void)
{
    len=strlen(pCh);
    if(len==0){
        cout<<"the string's length is 0"<<endl;
    return 0;
    }
    return len;
}
void Stroka::Print()
{
        cout<<"\n"<<pCh;
}
Stroka ::Stroka()                              //конструктор по умолчанию
{
    len=0;
    pCh= new char[len+1];
    pCh='\0';
    cout<<"Stroka::Stroka () is working"<<endl;
}
Stroka::Stroka(const char *s)                          //конструктор,принимающий Си-строку
{
    len=strlen(s);
    pCh=new char[len+1];
    strcpy(pCh,s);
    pCh[len]=0;
    cout<<"Stroka::Stroka(char *s) is working"<<endl;
}
 
Stroka::~Stroka()              //деструктор
{
    delete[] pCh;
    cout<<"Stroka::~Stroka() is working"<<endl;
}
 
Stroka::Stroka(Stroka & from)                             //конструктор копирования 
{
    char *tmpStr=from.GetStr();
    int L=from.GetLen();
    pCh=new char[L+1];
    strcpy(pCh,tmpStr);
    cout<<"Stroka::Stroka(Stroka &from)"<<endl;
}
Вот так у меня выглядит функция main()
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
 
using namespace std;
 
int _tmain()
{
    Stroka str1("Earth"),str2("2512Earth");
    str1=str2;
    str1.Print();
    system("pause");
    return 0;
}
В программе str2 успешно присваивается str1
str1 выводится на экран. Всё,вроде бы, работает.
Только после нажатия клавиши выскакивает ошибка о которой я написал.
Может быть,где-то не так с памятью работаю? Подскажите,пожалуйста.

Прикладываю скрин ошибки.
Так же прикладываю скрин работы программы.
Миниатюры
При вызове деструктора  вылазит ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)   При вызове деструктора  вылазит ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2015, 11:06
Ответы с готовыми решениями:

При вызове деструктора выдается ошибка _BLOCK_TYPE_IS_VALID (pHead->nBlockUse)
Вопрос на форуме поднимался раз 100, но все равно не могу понять в чем проблема. Знаю, что искать нужно в setSpace() и getFlat(). Но что...

При вызове delete[] _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Функция strtok влияет на массив second, после чего его невозможно удалить, не могу понять чего. first удаляет без проблем. FILE*...

Ошибка pHead->nBlockUse
После выполнения программы выскакивает ошибка. Почитал на форумах, что проблема или в деструкторе или в КК. Но я сам не смог разобраться...

5
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
28.04.2015, 12:17
str1=str2;
работает operator = , которого у вас нет. т.е. применяется дефолтный. в результате, при выходе из функции main вызываются деструкторы str1 и str2, которые удаляют одно и то же, что есть ошибка. удалять надо один раз.
решение - написать свой правильный operator =
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
28.04.2015, 14:28
...
Распространенные ошибки
0
 Аватар для Генрисон
4 / 3 / 1
Регистрация: 30.10.2012
Сообщений: 349
28.04.2015, 18:25  [ТС]
Perfilov, я написал свой оператор присваивания. Всё,вроде бы, работает,ошибок нет. Только можете проверить,на всякий случай?
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Stroka Stroka::operator=(Stroka &s)
{
    if(&s!=this)
    {
        delete []pCh;
        len=s.len;
        pCh= new char[len+1];
        strcpy(pCh,s.pCh);
        return *this;
    }
    return *this;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.04.2015, 19:00
Цитата Сообщение от Генрисон Посмотреть сообщение
Вот код:
Возвращаемый тип следует сделать ссылкой:
Stroka&
9 строка не нужна.
1
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
28.04.2015, 20:13
до кучи оператор = и конструктор копии должны принимать константную ссылку. они ведь не меняют входящий параметр. иначе такой код не будет компилится:
C++
1
2
const Stroka str1 = "222";
Stroka str2 = str1;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.04.2015, 20:13
Помогаю со студенческими работами здесь

Ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Здравствуйте. Я работаю с таким кодом. При выполнении строк 92-107 программа выдаёт окно с ошибкой. По всей видимости, что-то не так с...

Ошибка при вызове деструктора (при вызове delete в деструкторе)
Не могу найти ошибку, при вызове деструктора от класса, который был создан при помощи конструктора с параметром const String &amp;,...

Ошибка при вызове деструктора
Всем привет ! Есть класс class building { private: string *location_street; unsigned int *number_of_building; public...

Ошибка при вызове деструктора
Здравствуйте, помогите разобраться с проблемой, она довольно распространенная и на форуме куча сообщений про это но в моей программе я...

Ошибка при вызове деструктора
Добрый вечер! Почему при вызове деструктора вылетает ошибка после компиляции кода? #include &lt;conio.h&gt; #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru