Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 29.09.2018
Сообщений: 32

Ошибка работы с памятью

16.12.2018, 15:02. Показов 591. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, всем! Написал программу для поиска слов, которые можно составить из заданного слова. Она была протестирована с помощью valgrind. Были обнаружены ошибки:
valgrind ./a.out Dictonary.txt 001.dat.txt 001.ans.txt2
==16772== Memcheck, a memory error detector
==16772== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==16772== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==16772== Command: ./a.out Dictonary.txt 001.dat.txt 001.ans.txt2
==16772==
==16772== Conditional jump or move depends on uninitialised value(s)
==16772== at 0x402658: Trie::TrieAddWord(std::__cxx11::basic_st ring<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== by 0x402902: Trie::LoadDictonary(char*) (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== by 0x403116: main (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772==
==16772== Use of uninitialised value of size 8
==16772== at 0x40273F: Trie::TrieAddWord(std::__cxx11::basic_st ring<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== by 0x402902: Trie::LoadDictonary(char*) (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== by 0x403116: main (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772==
==16772== Invalid write of size 1
==16772== at 0x40273F: Trie::TrieAddWord(std::__cxx11::basic_st ring<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== by 0x402902: Trie::LoadDictonary(char*) (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== by 0x403116: main (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== Address 0x29ee39904 is not stack'd, malloc'd or (recently) free'd
==16772==
==16772==
==16772== Process terminating with default action of signal 11 (SIGSEGV)
==16772== Access not within mapped region at address 0x29EE39904
==16772== at 0x40273F: Trie::TrieAddWord(std::__cxx11::basic_st ring<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== by 0x402902: Trie::LoadDictonary(char*) (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== by 0x403116: main (in /home/ov7a/Downloads/Наборщик2/a.out)
==16772== If you believe this happened as a result of a stack
==16772== overflow in your program's main thread (unlikely but
==16772== possible), you can try to increase the size of the
==16772== main thread stack using the --main-stacksize= flag.
==16772== The main thread stack size used in this run was 8388608.
==16772==
==16772== HEAP SUMMARY:
==16772== in use at exit: 191,924 bytes in 25 blocks
==16772== total heap usage: 28 allocs, 3 frees, 191,930 bytes allocated
==16772==
==16772== LEAK SUMMARY:
==16772== definitely lost: 0 bytes in 0 blocks
==16772== indirectly lost: 0 bytes in 0 blocks
==16772== possibly lost: 0 bytes in 0 blocks
==16772== still reachable: 191,924 bytes in 25 blocks
==16772== suppressed: 0 bytes in 0 blocks
==16772== Rerun with --leak-check=full to see details of leaked memory
==16772==
==16772== For counts of detected and suppressed errors, rerun with: -v
==16772== Use --track-origins=yes to see where uninitialised values come from
==16772== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
Segmentation fault (core dumped)
вот код: строка была объявлена так: node NullNode до обнаружения ошибок(без инициализации); после исправления заменил ее node NullNode={}
Проблема в том, что я не могу определить где именно совершены эти ошибки, так как у меня нет valgrind. Может быть у кого- нибудь есть он и Вы сможете его протестировать и указать где мои ошибки в памяти, пожалуйста)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<set>
#include<clocale>
#include<codecvt>
 
#define ALPHABET_SIZE 33
 
class Trie
{
private:
 
    struct node //описание вершин бора. Хранятся переходы по каждой букве, либо 0 если перехода нет, isLeaf - указывает на то что слово заканчивается.
    {
        int child[ALPHABET_SIZE];
        bool isLeaf;
    };
    
    int flag = 0;
    int flag2 = 0;
public:
    node Nullnode = {}; // 
    const wchar_t FstreamSample[ALPHABET_SIZE] = { 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103 };
    std::vector<node> trie; // вектор вершин бора 
    std::set<std::wstring> Res; // полученные слова
    void TrieAddWord(std::wstring &str);
    bool LoadDictonary(char *filename);
    void GuessWordBypass(int number, unsigned position, bool Used[], std::wstring &str, std::wstring substr, unsigned &length);
    void GuessWord(std::wstring &str, unsigned &length);
};
 
 
 
void Trie::TrieAddWord(std::wstring &str)  // добавление слова
{
 
    int CurrentNode(0);
 
    for (auto i(str.begin()); i != str.end(); ++i)
    {
        if (*i == L'ё')
        {
            *i = 6;
        }
        if (*i >= L'а' && *i <= L'е')
        {
            *i = *i - 1072;
        }
        if (*i >= L'ж' && *i <= L'я')
        {
            *i = *i - 1071;
        }
 
        if (trie[CurrentNode].child[*i] == 0)
        {
            trie.push_back(Nullnode);
            trie[CurrentNode].child[*i] = trie.size() - 1;
            CurrentNode = trie.size() - 1;
        }
        else
        {
            CurrentNode = trie[CurrentNode].child[*i];
        }
    }
    trie[CurrentNode].isLeaf = true;
}
 
 
 
bool Trie::LoadDictonary(char* Filename) //загрузка словаря
{
    std::wifstream wif(Filename);
    std::locale utf8_locale(std::locale(), new std::codecvt_utf8<wchar_t>);
    wif.imbue(utf8_locale);
    wchar_t bom = L'\0';
    wif.get(bom);
    std::wstring Buff = L"";
    /*  _setmode(_fileno(stdout), _O_U16TEXT);*/
    while (!wif.eof())
    {
        wif >> Buff;
        if (Buff.find_first_of(L"ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ") != std::wstring::npos) // если есть заглавные буквы
        {
            continue;
        }
        if (Buff.find_first_of(L"~`!@#$%^&*()_+=-?><.,\\|/;:'""№qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890") != std::wstring::npos)
        {
            continue;
        }
        TrieAddWord(Buff);
    }
    wif.close();
    Buff.clear();
    return true;
}
 
void Trie::GuessWordBypass(int number, unsigned position, bool Used[], std::wstring &str, std::wstring substr, unsigned &length) // поиск в графе слов
{
    if (substr.size() > length) return;
    
    for (int i = 0; i < str.size(); ++i)
    {
        if (Used[i] == 0)
        {
            flag2 = 1;
            flag = i;
            break;
        }
    }
    if (flag2 == 0)
    {
        flag = str.size();
    }
    flag2 = 0;
 
    if (trie[number].isLeaf)
    {
 
        Res.insert(substr);
    }
 
    for (unsigned i(flag); i != str.size(); ++i)
    {
        if (i == position) continue;
        if (!Used[i])
        {
            if (trie[number].child[str[i]] != 0)
            {
                Used[i] = true;
                GuessWordBypass(trie[number].child[str[i]], i, Used, str, substr + str[i], length);
                Used[i] = false;
            }
        }
    }
}
 
void Trie::GuessWord(std::wstring &str, unsigned &length) // начальный обход из всех букв слова
{
 
    bool *Used = new bool[str.size()];
    for (unsigned int i = 0; i < str.size(); ++i)
        Used[i] = 0;
 
    for (unsigned i(0); i != str.size(); ++i)
    {
        if (trie[0].child[str[i]] != 0)
        {
            Used[i] = true;
            GuessWordBypass(trie[0].child[str[i]], i, Used, str, str.substr(i, 1), length);
            Used[i] = false;
        }
    }
    str.clear();
    delete[] Used;
}
 
 
int main(/*int argc, char *argv[]*/)
{
 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    Trie tr;
    tr.trie.push_back(tr.Nullnode);
    std::wstring Word = L"";
 
    /*if (argc < 4)
    {
    std::wcout << L"error" << std::endl;
    return -1;
    }*/
 
    std::wofstream out("output.txt");
    std::locale utf8_locale1(std::locale(), new std::codecvt_utf8<wchar_t>);
    out.imbue(utf8_locale1);
    if (!out)
    {
        return -1;
    }
 
 
    std::wifstream input("input.txt");
    std::locale utf8_locale(std::locale(), new std::codecvt_utf8<wchar_t>);
    input.imbue(utf8_locale);
    wchar_t bom = L'\0';
    input.get(bom);
    if (!input)
    {
        out << L"error" << std::endl;
        return -1;
    }
 
    if (tr.LoadDictonary("Dictonary.txt") == false) // словарь
    {
        out << "error" << std::endl;
        return -1;
    }
 
 
 
    input >> Word;
    if (Word.find_first_of(L"ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ") != std::wstring::npos) // если есть заглавные буквы
    {
        out << L"error" << std::endl;
        return -1;
    }
    if (Word.find_first_of(L"~`!@#$%^&*()_+=-?><.,\\|/;:'""№qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890") != std::wstring::npos)
    {
        out << L"error" << std::endl;
        return -1;
    }
    unsigned L = Word.size();
    for (auto i(Word.begin()); i != Word.end(); ++i)
    {
        if (*i == L'ё')
        {
            *i = 6;
        }
        if (*i >= L'а' && *i <= L'е')
        {
            *i = *i - 1072;
        }
        if (*i >= L'ж' && *i <= L'я')
        {
            *i = *i - 1071;
        }
    }
    tr.GuessWord(Word, L);
 
    for (auto i(tr.Res.begin()); i != tr.Res.end(); ++i)  //загрузка в выходной файл
    {
        for (auto j((*i).begin()); j != (*i).end(); ++j)
        {
            out << tr.FstreamSample[*j];
        }
        out << std::endl;
    }
 
    tr.Res.clear();
    tr.trie.clear();
    input.close();
    out.close();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.12.2018, 15:02
Ответы с готовыми решениями:

Ошибка работы с памятью
Добрый день, прошу вашей помощи.Пишу программу кодировки RC4. Пишу функцию перевода из букв в численные значения, т.е ищу номер букв в...

функции работы с памятью
нужно реализовать свою функцию memcpy. #include &lt;iostream&gt; using std::cout; using std::endl; using std::cin; void*...

Обнаружение ошибок работы с памятью
Подскажите как находить и устранять такого рода ошибки?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2018, 15:02
Помогаю со студенческими работами здесь

Функции для работы с динамической памятью
только начал изучать С++ сразу столкнулся с кучей вопросов. задача такая : разработать функции Create,Resize и Remove для создания,...

Объяснить код работы с динамической памятью
Объясните пожалуйста этот кусок кода : class test { public: int *p = new int(); }; int main() { test *b =...

Средства для контроля работы с динамической памятью
Здравствуйте, товарищи! При написании программы на С++ встала проблема контроля выделения/удаления динамической памяти (необходимо для...

Разобраться в принципе работы задачч. (Работа с динамической памятью через указатели. )
Вот условие задачи: Создать массив из N целых чисел, N вводит пользователь. Заполнить массив случайным образом в диапазоне от 1 до 12....

Литература для работы с памятью процессов
Собственно посоветуйте книжек, чтобы научиться работать с памятью процессов. Спасибо.


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru