Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HEAP CORRUPTION DETECTED не могу найти ошибку, проблема в удалении многомерного массива 
:(
    Опции темы
delias
Дата 9.12.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



ошибка там где пытаюсь удалять массив 
Код

for (int i=0;i<count;i++)
    delete[]str[i];
    delete[]str;

прошу помочь.
вроде бы правильно удаляю, но не могу никак скомпилировать без ошибок.
вот код всей программы:
Код

class CStrings {
    char **str;
    int size, count; //размер и кол-во заполненных строк
public:
    CStrings (int n);
    ~CStrings();
    void Add(char *s);
    void print();
    void del(int n);
    void deleteall ();
};

CStrings::CStrings(int n){
    size=n;
    str=new char*[n];
    count=0;
}
void CStrings::Add (char *s){
    str[count]=new char[strlen(s)+1];
    strcpy(str[count],s);
    count++;
}

CStrings::~CStrings(){
    for (int i=0;i<count;i++)
    delete[]str[i];
    delete[]str;
}
void CStrings::print(){
    for (int i=0; i<count;i++)
        cout<<str[i]<<endl;
}
void CStrings::del(int n){  
    char **strcopy = new char *[count-1];
    for (int i=0,j=0;j<count;j++)
    {
        if (j!=n){
    strcopy[i]=new char [strlen(str[j])];
    strcpy(strcopy[i],str[j]);
    i++;
        }
    }

    for (int i=0;i<count;i++)
    delete[]str[i];
    delete[]str;

    count--;
    

    str = new char *[count];
    for (int i=0;i<count;i++){
    str[i]=new char [strlen(strcopy[i])];
    strcpy(str[i],strcopy[i]);
    }

    for (int i=0;i<count;i++)
    delete[]strcopy[i];
    delete[]strcopy;
}

void CStrings::deleteall (){
    
    
    
    //str=0;
    
}

    void main()
    {
        CStrings s(20);
        s.Add("First");
        s.Add ("Second");
        s.Add ("Third");
        s.Add ("Four");
        s.Add ("Five");
        s.print ();
        s.del(1);
        cout<<endl;
        //s.print ();
        
    }



PM MAIL   Вверх
586
Дата 9.12.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Вот ошибки:
Цитата(delias @  9.12.2009,  15:12 Найти цитируемый пост)
    for (int i=0,j=0;j<count;j++)
    {
        if (j!=n){
    strcopy[i]=new char [strlen(str[j])+1];
    strcpy(strcopy[i],str[j]);
    i++;
        }
    }
//...
    str = new char *[count];
    for (int i=0;i<count;i++){
    str[i]=new char [strlen(strcopy[i])+1];
    strcpy(str[i],strcopy[i]);

Функцию можно написать проще:
Код
void CStrings::del(int n){  
    char **strcopy = new char *[count-1];
    for (int i = 0, j=0;j<count;j++)
    {
        if (i!=n){
    //strcopy[i]=new char [strlen(str[j])+1];
    //strcpy(strcopy[i],str[j]);
            strcopy[i] = str[j];
            i++;
        }
    }
    /*for (int i=0;i<count;i++)
    delete[]str[i];*/
    delete[]str[n];
    delete[]str;
    count--;
    
    /*str = new char *[count];
    for (int i=0;i<count;i++){
    str[i]=new char [strlen(strcopy[i])+1];
    strcpy(str[i],strcopy[i]);
    }
    for (int i=0;i<count;i++)
    delete[]strcopy[i];
    delete[]strcopy;*/
    str = strcopy;
}


Это сообщение отредактировал(а) 586 - 9.12.2009, 15:42
PM   Вверх
delias
Дата 9.12.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



точно, спасибо за совет  str = strcopy;

а вот по поводу ошибок - дело не в них.
вот, немного исправил, рабочий вариант:
Код


class CStrings {
    char **str;
    int size, count; //размер и кол-во заполненных строк
public:
    CStrings (int n);
   //~CStrings();
    void Add(char *s);
    void print();
    void del(int n);
    void deleteall ();
};

CStrings::CStrings(int n){
    size=n;
    str=new char*[n];
    count=0;
}
void CStrings::Add (char *s){
    str[count]=new char[strlen(s)+1];
    strcpy(str[count],s);
    count++;
}

//CStrings::~CStrings(){
//    for (int i=0;i<count;i++)
//    delete[]str[i];
//    delete[]str;
//}
void CStrings::print(){
    for (int i=0; i<count;i++)
        cout<<str[i]<<endl;
}
void CStrings::del(int n){  
    char **strcopy = new char *[count-1];
    for (int i=0,j=0;j<count;j++)
    {
        if (j!=n){
    strcopy[i]=new char [strlen(str[j])];
    strcpy(strcopy[i],str[j]);
    i++;
        }
    }

   /*for (int i=0;i<count;i++)
    delete[]str[i];
    delete[]str;*/

    count--;
    str=strcopy;

  /*for (int i=0;i<count;i++)
    delete[]strcopy[i];
    delete[]strcopy;*/
}


    void main()
    {
        CStrings s(20);
        s.Add("First");
        s.Add ("Second");
        s.Add ("Third");
        s.Add ("Four");
        s.Add ("Five");
        s.print ();
        s.del(3);
        cout<<endl;
        s.print ();
    }



если закомментирвать все операции с удалением массивов и деструктор - то работает безупречно
дело в удалении - что делаю не так?

Это сообщение отредактировал(а) delias - 9.12.2009, 16:04
PM MAIL   Вверх
586
Дата 9.12.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(delias @  9.12.2009,  15:51 Найти цитируемый пост)
а вот по поводу ошибок - дело не в них.

А вот чуть-чуть код исправишь - и эти ошибки всплывут.
PM   Вверх
delias
Дата 9.12.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



прощу прощения за оффтоп, как код подсвечивать? обычные тэги не работают
PM MAIL   Вверх
bsa
Дата 10.12.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



delias, работает тег [b] внутри комментариев. Если нужно выделять код, то оформляй его не с помощью тега [code], а с помощью [quote]. В этом случае, пропадет подсветка синтаксиса, правда...
PM   Вверх
Alexeis
Дата 10.12.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



void CStrings::Add (char *s) - не проверяет сколько элементов влазит в контейнер. Если добавить 1 лишний элемент, то он затрет специальную сигнатуру, которая расположена сразу за концом блока памяти выделенного в new. Перед выполнением delete происходит проверка этой сигнатуры. Если сигнатура не верна, дальнейшее выполнение программы невозможно, так как потенциально может привести к потере данных и к неопределенному поведению. Недопустимость такого поведения это одно из важнейших преимуществ C# по отношению к С++. 
  Если это не узкое место в программе, то я бы посоветовал использовать конструкцию std::vector<std::string>, как более безопасную. 

Это сообщение отредактировал(а) Alexeis - 10.12.2009, 11:40


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0850 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.