0 / 0 / 0
Регистрация: 11.08.2015
Сообщений: 108
1

heap corruption detected после return 0 в main

13.04.2020, 14:52. Показов 966. Ответов 5
Метки нет (Все метки)

Доброго времени суток.
У меня проблема я никак не могу найти ошибку в коде.
По идеи ошибка кроется где-то, где-то в моменте выделения памяти, но я никак не могу ее найти :/
В моменте когда у нас return 0 в мейне мы переходим в деструктор и на строчке delete[] str выдает ошибку "heap corruption detected after normal 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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
// TrainingCMake.cpp : Defines the entry point for the application.
//
 
#include "TrainingCMake.h"
#include <iostream>
 
class Base
{
    private:
        int a;
        char* str;
    public:
        int getA()const { return a; }
        char* getStr()const { return str; }
        Base():a(0),str(nullptr)
        {
            std::cout << "Base\n";
        }
        Base(char* mas)
        {
            if (mas)
            {
                a = strlen(mas)+1;
                str = new char[a];
                strcpy(str, mas);
                //for (size_t i = 0; i < a; i++)
                //  str[i] = mas[i];
                //str[a - 1] = '\0';
            }
            else
            {
                a = 0;
                mas = nullptr;
            }
        }
        Base(int v, char* mas):a(v+1)
        {
            if (mas)
            {
                str = new char[v];
                strcpy(str, mas);
                //for (size_t i = 0; i < v; i++)
                //  str[i] = mas[i];
                //str[a - 1] = '\0';
            }
            else
                str = nullptr;
        }
        virtual ~Base() 
        {
            
            if (str)
            {
                std::cout << "String to delete: ";
                for (size_t i = 0; i < a; i++)
                    std::cout << str[i];
                std::cout << std::endl;
                delete[] str;
            }               
            std::cout << "~Base\n";
        }
        virtual void func() 
        { 
            std::cout << "Base func()\n"; 
        }
        Base(const Base &obj):a(obj.a)
        {
            if (obj.str)
            {
                str = new char[a];
                strcpy(str, obj.str);
                //for (size_t i = 0; i < a; i++)
                //  str[i] = obj.str[i];
                //str[a - 1] = '\0';
            }
            else
                str = nullptr;
            
        }
        Base& operator=(const Base& obj)
        {
            if (this == &obj)
                return *this;
            delete[] str;
            a = obj.a;
            if (obj.str)
            {
                str = new char[a];
                strcpy(str, obj.str);
                //for (size_t i = 0; i < a; i++)
                //  str[i] = obj.str[i];
                //str[a - 1] = '\0';
            }
            else
                str = nullptr;
            return *this;
        }
        friend std::ostream& operator<<(std::ostream& out, const Base& obj)
        {
            if (obj.str) 
            {
                out << "String: " << obj.str << " Len: " << obj.a << std::endl;
            }
            else
                out << "String: empty  Len:0" << std::endl;
            return out;
        }
};
 
 
class Derived1 :public Base
{
    public:
        Derived1():Base()
        {
            std::cout << "Derived1\n";
        }
        virtual ~Derived1()
        {
            std::cout << "~Derived1\n";
        }
        void func()
        {
            std::cout << "Derived1 func()\n";
        };
};
 
class Derived2:public Base
{
    public:
        Derived2():Base()
        {
            std::cout << "Derived2\n";
        }
        Derived2(char* str) :Base(str)
        {
            std::cout << "Derived2\n";
        }
        virtual ~Derived2()
        {
            std::cout << "~Derived2\n";
        }
        virtual void func()
        {
            std::cout << "Derived2 func()\n";
        }
};
 
int main()
{
    Base* p = new Derived1;
    p->func();
    delete p;
    std::cout << "___________________________\n";
    Base* p2 = new Derived2;
    p2->func();
    delete p2;
    std::cout << "___________________________\n";
    Derived1* p3 = new Derived1;
    p3->func();
    delete p3;
    std::cout << "___________________________\n";
    char* str = "string1";
    Base b1("Hello");
    Base b2(b1);
    Base b3;
    Base b4(5, "Hello");
    std::cout << b1;
    std::cout << "___________________________\n";
    std::cout << b2;
    std::cout << "___________________________\n";
    std::cout << b3;
    b3 = b2;
    std::cout << "___________________________\n";
    std::cout << b3;
    std::cout << "___________________________\n";
    std::cout << b4;
    std::cout << "Hello CMake." << std::endl;
    //Devired2 b5("qwerty");
    //std::cout << b5;
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2020, 14:52
Ответы с готовыми решениями:

Heap Corruption detected (
что не правильно? запускаю и ошибка вылетает как на предидущей картинке template&lt;typename TT&gt;...

Heap corruption detected
Возникает эта ошибка при выполнении функции Strings::Append (строка 81, в меню это пункт 3)....

HEAP CORRUPTION DETECTED
Доброго времени суток, господа. Только начал изучать ООП и столкнулся с проблемой. Нужно...

HEAP CORRUPTION DETECTED
Собственно такую ошибку выдаёт: &quot;HEAP CORRUPTION DETECTED: after Normal block (#220) at 0x001970B8....

5
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.04.2020, 15:00 2
Лучший ответ Сообщение было отмечено Smeh_ как решение

Решение

Цитата Сообщение от Smeh_ Посмотреть сообщение
По идеи ошибка кроется где-то, где-то в моменте выделения памяти, но я никак не могу ее найти :/
Цитата Сообщение от Smeh_ Посмотреть сообщение
Base(int v, char* mas):a(v+1)
        {
            if (mas)
            {
                str = new char[v];
                strcpy(str, mas);
str = new char[v + 1];
1
3660 / 2997 / 828
Регистрация: 25.03.2012
Сообщений: 11,051
Записей в блоге: 1
13.04.2020, 15:01 3
C++
1
Base b4(5, "Hello");
в чём вообще смысл указывать размер строки явно(и неправильно), если есть конструктор, принимающий только строку и всё?
Ну и будет это неверно работать, полтому что вручную тут можно указать что угодно.
Ты вот написал 5, хотя массив нужно выделить размера 6.... кто-то ещё -1 укажет.
1
0 / 0 / 0
Регистрация: 11.08.2015
Сообщений: 108
13.04.2020, 15:01  [ТС] 4
Спасибо я слепой)
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
13.04.2020, 15:02 5
Конструктор в строке 36 что делать должен? Брать первые v символов? Тогда почему strcpy?
0
0 / 0 / 0
Регистрация: 11.08.2015
Сообщений: 108
13.04.2020, 15:02  [ТС] 6
Да Вы правы, я просто сейчас тренируюсь, и пробую разные варианты.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2020, 15:02
Помогаю со студенческими работами здесь

Heap corruption detected
Добрый день! Проблема вот в чём: когда выполнение кода доходит до 163 строки, появляется ошибка: &quot;...

Heap corruption detected
Heap corruption на строке 93 при первом же выполнении цикла. Из-за чего? #include &lt;locale.h&gt; //...

heap corruption detected
имеется класс CStr - строка, в нём есть конструктор CStr CStr::CStr(char *s) { length = 0;...

Heap Corruption Detected
Выдает ошибку HEAP CORRUPTION DETECTED, судя по всему где то ошиблась с распределением памяти...

Heap corruption detected
Ошибка возникает после отработки программы Заголовочный файл: #pragma once #include&lt;iostream&gt;...

HEAP CORRUPTION DETECTED
Не могу понять, почему выдает такую ошибку, когда я освобождаю память: &quot;HEAP CORRUPTION DETECTED:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru