Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
3 / 3 / 1
Регистрация: 17.12.2018
Сообщений: 256
1

Ошибка при освобождении памяти

01.09.2019, 19:01. Показов 870. Ответов 4

Условие задачи: В текстовом файле посчитать количество строк,
а также для каждой отдельной строки определить количество в ней символов и слов.



Не могу понять, почему не удаляется символьный массив.

Мой код:
Кликните здесь для просмотра всего текста

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//ofstream File("Задача_2.txt");
//File << "Hello world!\n lol kek chebureck! odin dwa tree four five.";
//File.close();
 
char *str = new char[100], ch;
ifstream File("Задача_2.txt");
if (File.is_open())
{
    int words = 0, lines = 0, letters = 0;
 
    while (File.get(ch))
    {
        str[words] = ch;
        words++;
    }
 
    char * st = new char[words];
    for (size_t i = 0; i <= words; i++)
        st[i] = str[i];
    delete[] str;
    str = st;
    str[words] = '\0';
    words = 0;
    st = nullptr;
 
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == '\n')
            lines++;
        else if (isalpha(str[i]))
            letters++;
    }
    string word;
    for (size_t i = 0; i < strlen(str); i++)
        word += str[i];
 
    delete[] str; // Почему-то массив не удаляется.
    str = nullptr;
 
    stringstream s;
    s << word;
    word = "";
    while (s >> word)
        words++;
 
    cout << "Кол-во строк: " << lines << endl;
    cout << "Кол-во слов: " << words << endl;
    cout << "Кол-во букв: " << letters << endl;
 
    File.close();
}
else
    cout << "Ошибка, такого файл не найден\n";
0

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2019, 19:01
Ответы с готовыми решениями:

Ошибка при освобождении памяти?
Доброго времени суток! Я только-только взялся за изучение c++. Дошел до динамической памяти...

Ошибка при освобождении памяти
Добрый День! Написал простую программу для понимания сути. Проблема в том, что код, который...

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; #include &lt;stdlib.h&gt; #include &lt;fstream&gt; #include...

Ошибка при освобождении памяти
Все идет замечательно, но вот когда происходит удаление массива программа крашится.. #include...

4
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
01.09.2019, 19:11 2
Он может не удаляться, если не входит в if.
В другом случае, почему вы считаете, что память не освобождается?
0
3 / 3 / 1
Регистрация: 17.12.2018
Сообщений: 256
02.09.2019, 17:48  [ТС] 3
Cortas, он всегда входит в if.
0
3 / 3 / 1
Регистрация: 17.12.2018
Сообщений: 256
02.09.2019, 17:51  [ТС] 4
Вот какая ошибка вылазит:
0
Миниатюры
Ошибка при освобождении памяти  
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
02.09.2019, 19:56 5
Похоже вы вылезли за пределы памяти, либо удалили то, что программе не принадлежит.
....
Да так и есть. Неправильно вы тему назвали.
Вот в этой строчке:
C++
1
char * st = new char[words];
Вы выделяете words количество памяти, а в следующей
C++
1
for(size_t i = 0; i <= words; i++)
вы вылезаете за пределы памяти.
Из-за этого, при освобождении памяти и вылезает ошибка.

Исправить так:
C++
1
char * st = new char[words + 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
28
29
30
31
32
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
 
const string fileName = "input.txt";
 
int main() {
    ifstream fin(fileName);
    if(!fin) { cout << "File could not be opened!"; return 0; }
    
    string buffer;
    vector<pair<unsigned, unsigned>> lines; //first - words, second - letters in word
    while(getline(fin, buffer)) {
        unsigned letters = 0, words = 0;
        letter = buffer.size();
        
        stringstream parse(buffer);
        while(parse >> buffer) words++;
        
        lines.push_back(make_pair(letters, words));
    }
    
    cout << "Total lines: " << lines.size() << endl;
    for(int i = 0; i < lines.size(); i++)
        cout << "Line #" << i 
            << ": words - " << lines[i].first 
            << " | letters - " << lines[i].second << endl;
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2019, 19:56

Ошибка при освобождении памяти
#include &lt;iostream&gt; using namespace std; template&lt;class T&gt; class pvector { T **p; int...

Ошибка при освобождении памяти
Здравствуйте, программа завершает работу в этом коде #include &lt;iostream&gt; #include &lt;ctime&gt;...

Ошибка при освобождении памяти
Задача: Из стандартного входного потока вводятся сроки. Признаком завершения каждой сроки является...

Ошибка при освобождении памяти
Здравствуйте! Пишу на MS Visual C++ 2010, windows 7. При вызове функции resize() на строке ...

Ошибка при освобождении памяти
Короче, есть простенький метод класса, в котором за полем под названием ID закрепляется новое айди....

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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