Поиск:

Ответ в темуСоздание новой темы Создание опроса
> При [] delete, ошибка возникает 
:(
    Опции темы
Rickert
Дата 23.10.2006, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Есть функция из которой вызывается другая функция. Во второй выделяется память для указателя типа char:
Код

...
char* mstr = new char[str.GetLength()]
...

Где str - CString передоваемая в функцию, как параметр.
Далее идут различные манипуляции со строкой mstr и в конце функции:
Код

...
delete [] mstr;
delete [] chr;
}

chr - другой указатель типа char тоже.
Иду дебагом и на delete [] mstr вываливается ошибка. См. аттач
 smile

Добавлено @ 05:15 
ЗЫ
пробовал убрать сейчас первый delete [] mstr и оставить только delete [] chr - та же фигня. А если убрать обоих, то получаем утечку памяти, что ни есть гуд.

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  01.jpg 22,33 Kb


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
DukeCpp
Дата 23.10.2006, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.2.2006
Где: St.Petersburg

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



Если не ошибаюсь, такое бывает при попытке высвободить занятую чем-то ещё другим память. Т.е. участок памяти под вашу строку пересекается с другой зарезервированной памятью. Приведите код полностью, если можно.

Если не происходит переназначений указателей, то можете поюзать auto_ptr и забыть про необходимость удаления; иначе, если это недопустимо (использование auto_ptr), то можно пользовать указатель со счётчиком ссылок boost::shared_ptr;

Это сообщение отредактировал(а) DukeCpp - 23.10.2006, 05:27
PM   Вверх
Rickert
Дата 23.10.2006, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Код

{
    CString str, nstr;
    
    m_Edit2.GetWindowText(str);
    char* mstr = new char[str.GetLength()];
    
    memcpy(mstr, str.GetBuffer(), str.GetLength());
    mstr[str.GetLength()] = 0;

    char* chr = new char;
    bool once = 0;

    for (int j = 0; j < str.GetLength(); j++)
    {
        *chr = mstr[j];
        chr[1] = 0;
        for (int i = 0; i < 66; i++)
            if (!rus[i].Compare(chr))
            {
                nstr.Append(lat[i].GetBuffer());
                break;
            }
            else
                if (i >= 65)
                    nstr.Append(chr);
        once = 0;
    }
    m_Edit3.SetWindowText(nstr.GetBuffer());

    int iter = m_Edit2.GetWindowTextLength();
    int parts1 = 0;

    if (iter > 60)
    {
        if (iter % 60 == 0)
            parts1 = iter / 60;
        else
            parts1 = iter / 60 + 1;
    }
    else
        if (iter != 0)
            parts1 = 1;

    int iter2 = m_Edit3.GetWindowTextLength();
    int parts2 = 0;

    if (iter2 > 140)
    {
        if (iter2 % 140 == 0)
            parts2 = iter2 / 140;
        else
            parts2 = iter2 / 140 + 1;
    }
    else
        if (iter2 != 0)
            parts2 = 1;

    str.Format("Длинна: %d (%d частей)", iter, parts1);
    m_Static5.SetWindowText(str.GetBuffer());
    str.Format("Длинна: %d (%d частей)", iter2, parts2);
    m_Static6.SetWindowText(str.GetBuffer());
    delete [] mstr;
    delete [] chr;
}



--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
DukeCpp
Дата 23.10.2006, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 27.2.2006
Где: St.Petersburg

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



Вот здесь происходит нечестное обращение с памятью:
Код

 char* chr = new char;

Выделили один байт (почему бы, кстати, не просто char chr, если нужен всего один байт; не криминально, -- просто непонятно). Далее:
Код

chr[1] = 0;


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

Теперь ясно, зачем был new: 

видимо, имелось ввиду:
Код

 char* chr = new char[2];


Тоже самое здесь:

Код

m_Edit2.GetWindowText(str);
char* mstr = new char[str.GetLength()];
memcpy(mstr, str.GetBuffer(), str.GetLength());
mstr[str.GetLength()] = 0;


выделили str.GetLength() байт. Их индексы 0..str.GetLength()-1. Обращаемся к str.GetLength()-ому, а под него память не выделяли. Решение тоже: поставить +1.

Это сообщение отредактировал(а) DukeCpp - 23.10.2006, 06:23
PM   Вверх
Rickert
Дата 27.10.2006, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Блин, вот я дурень, проверял же это!
Благодарю!


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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