Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Gogime
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 24
#1

Ошибка "*.exe вызвал срабатывание точки останова" и "HEAP CORRUPTION" при вызове деструктора программой

28.10.2016, 22:24. Просмотров 646. Ответов 9
Метки нет (Все метки)

Здравствуйте!
Сделал простенькое упражнение на указатели, но программа выдает названные ошибки.
При первом после последнего сохранения проекта запуске вылезает "точка останова", а при последущих -- "HEAP CORRUPTION".
Отладка показывает, что проблема выскакивает на return 0, а точнее, при вызове программой деструктора для объекта str.
В чем дело? Как это исправить? Подскажите, пожалуйста, опытные люди

C++ (Qt)
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
#include <iostream>
#include <Cctype>
#include <cstring>
using namespace std;
 
class String
{
private:
    char* str;
public:
    String(char* s)
    {
        int length = strlen(s);
        str = new char[length];
        strcpy_s(str, strlen(str), s);
    }
    ~String()
    {
        delete str;
        //cout << "String deleted\n";
    }
    void show()
    {
        cout << str << '\n';
    }
    void upit()
    {
        for (int i = 0; i < strlen(str); i++)
        {
            str[i] = toupper(str[i]);
        }
    }
};
 
 
int main()
{
    system("color 70");
 
    String str("yob tvou mat eto pizdets!");
    str.show();
    //str.upit();
    //str.show();
 
 
 
    cout << '\n';
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2016, 22:24
Ответы с готовыми решениями:

Выползает такая ошибка "test.exe вызвал срабатывание точки останова."
Одну итерацию цикла программа проходит, затем на середине второй выскакивает...

" *.exe вызвал срабатывание точки останова " при закрытии консоли
Здравствуйте, уважаемые. Есть задание: Сделать &quot;гибкий&quot; массив на основе...

".exe вызвал срабатывание точки останова."
перечитал уже все похожие сообщения на форуме ничего к моему случаю не...

Почему вылетает ошибка "файл вызвал срабатывание точки останова"?
Уже который день мучаюсь с сортировками Тестируешь, вроде всё нормально, но...

Вылетает "Вызвал срабатывание точки останова" после закрытия консоли
Есть такая задача: нужно вводить массив, пока не введешь число,отличающейся...

9
nd2
2835 / 2402 / 1057
Регистрация: 29.01.2016
Сообщений: 8,042
28.10.2016, 22:28 #2
Цитата Сообщение от Gogime Посмотреть сообщение
i
C++
1
2
nt length = strlen(s); 
str = new char[length];
C++
1
str = new char[length + 1];
1
hoggy
Заблокирован
Эксперт С++
28.10.2016, 22:39 #3
Цитата Сообщение от Gogime Посмотреть сообщение
delete str;
заменить на:

C++
1
delete [] str;
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4424 / 2395 / 664
Регистрация: 18.10.2014
Сообщений: 4,050
28.10.2016, 22:45 #4
Лучший ответ Сообщение было отмечено Gogime как решение

Решение

Цитата Сообщение от Gogime Посмотреть сообщение
C++
1
2
3
4
5
6
String(char* s)
{
  int length = strlen(s);
  str = new char[length];
  strcpy_s(str, strlen(str), s);
}
Тут ошибка на ошибке. Во-первых, String(const char* s). Во-вторых, для хранения строки длины length нужен массив размера length+1. В-третьих, что такое strlen(str) в то время, когда str еще cодержит мусор???

Цитата Сообщение от Gogime Посмотреть сообщение
C++
1
2
3
4
5
~String()
{
  delete str;
  //cout << "String deleted\n";
}
delete[] str;!
1
hoggy
Заблокирован
Эксперт С++
28.10.2016, 22:56 #5
TheCalligrapher,
здесь точно все в порядке?
C++
1
str[i] = toupper(str[i]);
может быть нужно что-то типа такого:
C++
1
2
const auto v = toupper(str[i]);
str[i] = v;
1
Gogime
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 24
28.10.2016, 23:22  [ТС] #6
Спасибо!
По порядку: const нужен, чтобы строка s не изменилась внутри метода?
length+1 -- это чтобы поместить в конец '\0'? Я уже подправлял это до того, как написал сюда, а отправленный мной код просто в это время лежал в буфере обмена) Квадратные скобки у delete[] я тоже именно по этой причине забыл здесь дописать.
strlen(str), вроде как, должна считать символы строки, пока не наткнется на '\0'... Странно, но у меня нормально работает и конструктор, и upit(), и show(). Ошибка связана именно с деструктором.
Спасибо еще раз за подсказки, сейчас исправлю и посмотрю, что получится.
0
hoggy
Заблокирован
Эксперт С++
28.10.2016, 23:26 #7
Цитата Сообщение от Gogime Посмотреть сообщение
Ошибка связана именно с деструктором.
нет, у вас вылетал именно конструктор


http://rextester.com/YDQGO81095


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
#include <iostream>
#include <cstring>
using namespace std;
 
class String
{
private:
    char* str;
public:
    String(const char* s)
        :str()
    {
        const auto length = strlen(s);
        str = new char[length + 1];
            
        #ifdef _MSC_VER
            strcpy_s(str, length + 1, s);
        #else
            strcpy(str, s);
        #endif
    }
    
    ~String() { delete [] str; }
    
    void show()const
    {
        cout << str << '\n';
    }
    void upit()
    {
        const auto size = strlen(str);
        for (size_t i = 0; i < size; ++i)
        {
            const auto v = toupper(str[i]);
            str[i] = v;
        }
    }
};
 
 
int main()
{
    system("color 70");
    String str("hello world!");
    str.show();
    str.upit();
    str.show();
    cout << '\n';
    system("pause");
}
0
Gogime
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 24
28.10.2016, 23:27  [ТС] #8
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
String(const char* s)
    {
        int length = strlen(s);
        str = new char[length+1];
        strcpy_s(str, length+1, s);
    }
    ~String()
    {
        delete[] str;
        //cout << "String deleted\n";
    }
Сделал вот так -- теперь все работает отлично! Причина, по которой появлялась ошибка с памятью -- это length вместо length+1.
0
nd2
2835 / 2402 / 1057
Регистрация: 29.01.2016
Сообщений: 8,042
28.10.2016, 23:29 #9
Цитата Сообщение от Gogime Посмотреть сообщение
strlen(str), вроде как, должна считать символы строки, пока не наткнется на '\0'...
Ты же туда ещё ничего не скопировал, где там тогда '\0' искать?

Добавлено через 1 минуту
Цитата Сообщение от Gogime Посмотреть сообщение
Причина, по которой появлялась ошибка с памятью -- это length вместо length+1.
А вот это, как бы, ты не исправлял?
Цитата Сообщение от Gogime Посмотреть сообщение
delete[] str;
Цитата Сообщение от Gogime Посмотреть сообщение
strcpy_s(str, length+1, s);
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4424 / 2395 / 664
Регистрация: 18.10.2014
Сообщений: 4,050
29.10.2016, 00:24 #10
Цитата Сообщение от Gogime Посмотреть сообщение
По порядку: const нужен, чтобы строка s не изменилась внутри метода?
const нужен для того, чтобы этот метод можно было вызывать с константными строками в качестве аргумента, в т.ч. со строковыми литералами. Формально ваш оригинальный код даже не должен был компилироватся без этого const, потому что вы вызываете конструктор с константной строкой. Такое разрешалось до 2011 года, н начиная с С++11 это запрещено.

Цитата Сообщение от Gogime Посмотреть сообщение
length+1 -- это чтобы поместить в конец '\0'?
Да.

Цитата Сообщение от Gogime Посмотреть сообщение
strlen(str), вроде как, должна считать символы строки, пока не наткнется на '\0'...
Да, но у вас там в этот момент еще не на что натыкаться - свежевыделенная память содержит случайный мусор. Вот в этом случайном мусоре вы и пытаететсь "считать символы строки, пока не наткнется на '\0'".

Цитата Сообщение от Gogime Посмотреть сообщение
Странно, но у меня нормально работает и конструктор, и upit(), и show(). Ошибка связана именно с деструктором.
Это проявляются ваши ошибки только в деструкторе. А сделаны они намного ранее.
0
29.10.2016, 00:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2016, 00:24

Delete [] "вызвал срабатывание точки останова"
Всем привет. Стоит следующая задача на ЛР - создать функцию, которая дописывает...

Ошибка в коде "вызвано срабатывание точки останова"
Вот код на С++ По идее все должно работать, но мне выдается ошибка, которую я...

Ошибка: "вызвано срабатывание точки останова"
Ошибка, по идее, в освобождении памяти, но не могу понять именно в чем....


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

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

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