Форум программистов, компьютерный форум CyberForum.ru

heap corruption detected - C++

Восстановить пароль Регистрация
 
Homeless coder
 Аватар для Homeless coder
5 / 5 / 0
Регистрация: 17.03.2013
Сообщений: 24
18.03.2013, 23:57     heap corruption detected #1
имеется класс CStr - строка,
в нём есть конструктор CStr
C++
1
2
3
4
5
6
7
8
9
CStr::CStr(char *s)
{
    length = 0;
    while (s[length]) length++;
    str = new char[length+1];
        for (int i = 0; i < length; i++)
            str[i] = s[i];
    str[length+1] = '\0';
}
и есть деструктор
C++
1
~CStr() {delete [] str;};
но при вызове деструктора вылезает сообщение - "heap corruption detected".. а в чём проблема, понять не могу
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2013, 23:57     heap corruption detected
Посмотрите здесь:

Heap corruption detected C++
HEAP CORRUPTION DETECTED C++
C++ ошибка Heap corruption detected
C++ Heap corruption detected
C++ Heap Corruption detected (
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.03.2013, 00:15     heap corruption detected #2
Конструктор можно попроще написать.
C++
1
CStr(const char *s) : length(strlen(s)), str(strcpy(new char[length + 1], s)) {}
Цитата Сообщение от Homeless coder Посмотреть сообщение
при вызове деструктора вылезает сообщение - "heap corruption detected"
Вариантов много. Возможно, где-то сместили или уже освободили str. Покажите весь код.
Homeless coder
 Аватар для Homeless coder
5 / 5 / 0
Регистрация: 17.03.2013
Сообщений: 24
19.03.2013, 00:28  [ТС]     heap corruption detected #3
собственно кода нет, начал писать класс и столкнулся с этой проблемкой
класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CStr
{
protected:
    char *str;
    int length;
public:
    CStr();
    CStr(char *s);
    CStr(char ch);
    ~CStr() {delete [] str;};
    
        int get_length() const {return length;};
        void show() const;
    
    void clear() {str = '\0'; length = 1;};
    
    CStr operator= (CStr & x);
    CStr operator+ (CStr & x);
    CStr operator== (CStr & x);
};
метод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CStr::CStr(char *s)
{
    length = 0;
    while (s[length]) length++;
    str = new char[length+1];
        for (int i = 0; i < length; i++)
            str[i] = s[i];
    str[length+1] = '\0';
}
void CStr::show() const 
{
    for (int i = 0; i < length; i++)
        cout << str[i];
}
main():
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <conio.h>
#include "class.h"
using namespace std;
void main()
{
    char *x = "hello my world";
    CStr B(x);
    B.show();
    B.~CStr();
    getch();
}
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.03.2013, 01:02     heap corruption detected #4
str[length+1] = '\0'; заменить на str[length] = '\0';
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
19.03.2013, 01:14     heap corruption detected #5
Цитата Сообщение от Homeless coder Посмотреть сообщение
char *x = "hello my world";
такие вещи надо сразу const делать.

void main убрать, всю реализацию в хедере .h убрать

Добавлено через 1 минуту
C++
1
2
3
4
5
void CStr::show() const 
{
    for (int i = 0; i < length; i++)
        cout << str[i];
}
C++
1
2
3
4
void CStr::show() const 
{
        cout << str;
}
Добавлено через 3 минуты
Цитата Сообщение от lemegeton Посмотреть сообщение
Конструктор можно попроще написать.
C++
1
CStr(const char *s) : length(strlen(s)), str(strcpy(new char[length + 1], s)) {}
Главное, не забыть при этом местами поля поменять

Добавлено через 3 минуты
Проблема в том, что дважды вызывается деструктор. Удалите строку
C++
1
B.~CStr();
Yandex
Объявления
19.03.2013, 01:14     heap corruption detected
Ответ Создать тему
Опции темы

Текущее время: 21:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru