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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
#1

Мусор в памяти, выделенной динамически - C++

24.09.2013, 23:36. Просмотров 324. Ответов 4
Метки нет (Все метки)

Есть код, выполняет разархивацию файла, закодированного LZ77. Вот его основная часть: цикл в котором проверяется каждый бит в маске и согласно его значению раскодируется файл. Если бит установлен в 0, то следующий байт нужно просто считать как есть, если установлен в 1, то это ссылка на место, где можно найти эту часть файла.
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
while (!infile.eof())
    {
        infile.read(mask, maskSize);
        if (infile.eof()) break;
        for (int i = 0; i < dictionarySize; i++)
        {
            if (!getMaskBit(mask, i))
            {
                std::string tmpStr;
                tmpStr += infile.get();
                if (infile.eof()) break;
                refreshWriteBuf(&writeBuffer, &outfile, dictionarySize, tmpStr);
            }
            else
            {
                phPosition = (ushort)infile.get();
                phLength = (ushort)infile.get();
                if (infile.eof()) break;
                char *phrase = new char [phLength + 1];
                *phrase = NULL;
                writeBuffer.copy(phrase, phLength, writeBuffer.length() - phPosition);
                refreshWriteBuf(&writeBuffer, &outfile, dictionarySize, phrase);
                //*phrase = NULL;
                delete [] phrase;
            }
        }
    }
В else ветке как раз и выполняется обработка ссылки. считывается phPosition - это смещение, т.е. сколько символов назад встречается данная последовательность. phLength - длина данной последовательности. Словарем является writeBuffer, в котором уже раскодированная последовательность. Мы копируем в переменную phrase кусок, на который указывает ссылка и добавляем ее к writeBuffer.
Главная проблема - иногда метод string::copy работает неправильно, копирует из writeBuffer не то, что нужно, хотя phPosition и phLength считаны правильно, и указывают туда, куда надо. Можно заметить, что неправильные куски всречались в файле ранее, будто они где то в памяти сохраняются и потом всплывают.
0
Миниатюры
Мусор в памяти, выделенной динамически   Мусор в памяти, выделенной динамически  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 23:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Мусор в памяти, выделенной динамически (C++):

Ошибка при удалении динамически выделенной памяти - C++
Добрый день, хочу удалить выделенный массив, но выдает ошибку. Вот собственно код создаваемой функции. using namespace std; void...

Как склеить два куска динамически выделенной памяти? - C++
Есть такой код char *arr = (char *) malloc(1); char *plus = (char *) malloc(25); arr = memcpy(arr + 1, plus, 25); Вопрос: можно ли...

Как обнулить указатель на одну ячейку в динамически-выделенной памяти? - C++
Выделю память под 10 элементов: int* p = new int; Наполняю значениями: for(int i = 0; i&lt;10; i++) { p = i; } Можно...

Удаление выделенной памяти - C++
#include &lt;iostream&gt; using namespace std; int main() { int localVariable = 5; int * pLocal=...

Удаление выделенной памяти - C++
есть такой класс: выделяю память под element *ptemp = new element; и iris *temp = new iris; нужно ли отдельно удалять new iris?? ...

Освобождение памяти, выделенной через new - C++
Я прочитал, что память динамически для строки, можно выделить к примеру узнать длину строки strlen(tex) и нужно добавить единицу для...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
24.09.2013, 23:48 #2
Цитата Сообщение от [WRG] Посмотреть сообщение
C++
1
*phrase = NULL;
Полагаю, имелось в виду
C++
1
*phrase = '\0';
Полагаю дальше, что во phrase должна оказаться C-строка. Но в таком случае она должна заканчиваться нулем:
C++
1
2
3
4
char *phrase = new char [phLength + 1];
*phrase = '\0';
writeBuffer.copy(phrase, phLength, writeBuffer.length() - phPosition);
phrase [phLength] = '\0';
1
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
24.09.2013, 23:56  [ТС] #3
нельзя использовать NULL для С - строк?
0
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
24.09.2013, 23:59 #4
NULL - атавизм из C, обозначающий нулевой пойнтер, это скорее всего просто макрос со значением 0. Использовать-то его так можно, но очень не наглядно.
1
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.09.2013, 00:01  [ТС] #5
Спасибо, заработало! Премного благодарен!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2013, 00:01
Привет! Вот еще темы с ответами:

Корректно ли освобождение выделенной памяти? - C++
Извиняюсь, если такой вопрос уже звучал. Допустим есть такой кусок кода: struct A { int *x; } *b; void main() { b = new A;...

Выход за границу выделенной памяти - C++
Какие операции (кроме записи) за пределами выделенной памяти приводят к UB?

Массив: Освобождение выделенной памяти - C++
Сказали переделать код, нужно что бы память освобождалась не в отдельной функции а как то по другому так и не понял как. #include...

Освобождение памяти, выделенной под массив - C++
Выделяю память под массив: int (*array_1) = new int; как освободить то, что выделил? И еще вопрос: как указателю...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.09.2013, 00:01
Ответ Создать тему
Опции темы

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