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

Перезапись строки и Bad_alloc - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Функция редактирования строк http://www.cyberforum.ru/cpp-beginners/thread644531.html
Доброго времени суток. Столкнулся со следующей проблемой: void Erase(char **str, int pos, int n) { char *newstr1, *newstr2; newstr2 = *str; int i = 0, len; len = strlen(newstr2); if (len >= pos + n) { newstr1 = new char;
C++ Опишите класс "Вектор" 1. Опишите класс "Вектор". Данные класса: координаты начала и конца вектора. Методы класса: должны обеспечить минимальную функциональность объекта. 2.Перегрузите операцию сложения векторов с использованием операции - метода класса, а операцию вычитания с использованием дружественной ф-ии. 3.Перегрузите унарную операцию ++ для инкремента вектора как метод класса, а-- как дружественную... http://www.cyberforum.ru/cpp-beginners/thread644494.html
C++ Конвертирование в wstring&
Всем привет! Не могу понять почему невозможно конвертировать из wchar_t в wstring& Вызов метода client -> CompareTwoString( iteratorclient -> nameclient, positionclient ,lenghtname ); функция bool CompareTwoString( wstring &one, wstring &two, int position ) { //something
C++ В строке с найти количество слов не содержащий подстроку
В строке с найти количество слов не содержащий подстроку с2 вывести эти слова где с2=аб
C++ Матрицы: поменять местами первую строку и строку, содержащую максимальный элемент http://www.cyberforum.ru/cpp-beginners/thread644409.html
1)В матрице поменять местами 1 строку и строку содержащие последнее вхождение элемента максимального где максимальный- максимальный элем всей матрицъ вывести итоговую матрицу. 2)В матрице обнулить Все строки содержащие элемент мин более одного раза мин минимальный элемент всей матрицы вывести итоговую матрицу
C++ Двузначное число разделить на две позиции в массиве у меня есть действительные числа в массиве от 1 до 15. Как сделать так что бы начиная с 10, десять стояла не на одной позиции, а разделилось на две, то есть что бы 10 делилась на 1 и на 0, что бы на 9 позиции стоит 1, а на 10 стоит 0. подробнее

Показать сообщение отдельно
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
30.08.2012, 19:14     Перезапись строки и Bad_alloc
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
BOOL ROOM::AddHistory(const char* newHistory)
{
    BOOL newHistorySize = strlen(newHistory)+1;
    char* shiftHistory;
    if (_r_historySize+newHistorySize >= ROOM_HISTORY_SIZE)
    {
        shiftHistory = new char[ROOM_HISTORY_SIZE+1];
        int erasableHistorySize = 0, shiftPos = 0;
        do
        {
        --_r_historyNoteCount;
        erasableHistorySize += (strlen(_r_history+erasableHistorySize) + 1);
        } while (_r_historySize+newHistorySize-erasableHistorySize >= ROOM_HISTORY_SIZE);
        for (size_t noteCount=1; noteCount<=(unsigned)_r_historyNoteCount;
            ++noteCount, shiftPos+=(strlen(shiftHistory+shiftPos)+1))
        {
            strcpy_s(shiftHistory+shiftPos, ROOM_HISTORY_SIZE-shiftPos, "");
            strcpy_s(shiftHistory+shiftPos, ROOM_HISTORY_SIZE, _r_history+erasableHistorySize+shiftPos);
        }
        _r_historySize = shiftPos;
        delete _r_history;
        _r_history = shiftHistory;
    }
 
    strcpy_s(_r_history+_r_historySize, ROOM_HISTORY_SIZE-_r_historySize, "");
    strcat_s(_r_history+_r_historySize, ROOM_HISTORY_SIZE-_r_historySize, newHistory);
    _r_historySize += newHistorySize;
    ++_r_historyNoteCount;
 
    return PROCESS_SUCCESS;
}
Данный код получает сообщение, которое нужно добавить в историю. Если суммарная длина больше константы, то затираются предыдущие сообщения (да, здесь используется ещё один буфер, который можно не использовать и перезаписывать само сообщение собой же). Дело в том, что, иногда, она вызывает Bad_alloc exception, а иногда отрабатывает нормально. Константа ROOM_HISTORY_SIZE = 8182. Если её повысить до 200к и попробовать записать столько же символов, то всё нормально, а значит памяти хватает и проблема не в этом.

Я бы отписал стэк вызова функций, но после последний час я не могу получить эту ошибку снова, хотя и ничего не менял в коде.

Добавлено через 1 час 33 минуты
С чем вообще может быть связан Bad_alloc помимо того, что кончилась память? Ведь оператор new выделяет память в куче, которая ограничена физ. памятью, а значит о конце кучи при 4гб ОЗУ и выделении массива на 8кб не может и речи идти

Добавлено через 38 минут
Если повысить буфер до 28 тысяч, то выкидывает ошибку strcpy_s в строке :
strcpy_s(shiftHistory+shiftPos, ROOM_HISTORY_SIZE, _r_history+erasableHistorySize+shiftPos); - которая под номером 18. Буфер на 18 тысяч выкидывает так же на strcpy_s в этой же строчке. Буфер на 8 тысяч через раз выкидывает исключение то в этой функции, то в другой, где я выделяю буфер на 1004 элемента типа char. Последняя проблема имела бы решения (в моей понимании) при переполнении, но в сосокупности с "безошибочной работой" до 28 тысяч.. Даже и не знаю, что сказать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru