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

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

Войти
Регистрация
Восстановить пароль
 
gor2521
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 8
#1

Динамеческая память. Исключение - C++

19.09.2012, 21:27. Просмотров 373. Ответов 6
Метки нет (Все метки)

Всем доброго времени суток!
Предисловие: Имеется задание на связные списки. Суть задания не важна, но вкратце: по входным строкам формировать дерево папок. Используемый мною язык, очевидно, c++, который четкой родственной связи со мной проявлять, пока что, не сильно желает.

Проблема, как она есть: При выделении памяти под структуру данных (в листинге строка #39), при помощь оператора new, обрабатывается исключение: std::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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  //Main Loop
  for (int i = 0; i < adressNum; i++)
  {
    in >> maxAdress;
    adressLen = strlen(maxAdress);
    adress = new char[adressLen + 1];
    strcpy_s(adress, adressLen + 1, maxAdress);
 
    /*After we will one buy one part adress string on Folder Names and 
    with few rules add them into Folder Lists, data, which need to be
    given together with FolderName is:
     a. Level of folder (Ex. "C\Files\Games" C has level 0, Files - 1, etc)
     b. Parant name (For ex. above: "C" folder is parant for folder "Files")
     */
    char *curFolder = NULL;
    char *curParent = NULL;
    int curLevel = 0, j = 0;
 
    /*At first reading ROOT folder and choosing List in fList array
    in which we will add folders form adress. It can be new list or already list,
    which already exist*/
    curParent = new char[MAX_FOLDER_NAME + 1];
    curFolder = new char[MAX_FOLDER_NAME + 1];
    ReadFolder(adress, j, curFolder); 
 
    while (fList[j].Head() != NULL)
    {
      if (!strcmp(fList[j].Head(), curFolder))
        break;
      j++;
    }
 
    listNum = j;
    j = strlen(curFolder) + 1;
 
    
    for (j; j < adressLen; j = j + strlen(curFolder) + 1)
    {
      FolderListItem *newItem = new FolderListItem(curFolder, curLevel, curParent);
      fList[listNum].AddInOrder(newItem);
 
 
      curLevel++;
 
      strcpy_s(curParent, MAX_FOLDER_NAME + 1, curFolder);
 
      ReadFolder(adress, j, curFolder);
 
    }
    fList[listNum].PrintList(outputFile);
 
    delete [] curParent;
    delete [] curFolder;
    delete [] adress;
  }
PS: На всякий случай прикрепляю заголовочный файл с описанием класса для списка, файл с его реализацией и мэйн.
0
Вложения
Тип файла: txt mainCpp.txt (2.8 Кб, 2 просмотров)
Тип файла: txt FolderListH.txt (1.6 Кб, 4 просмотров)
Тип файла: txt FolderListCpp.txt (1.7 Кб, 4 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2012, 21:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамеческая память. Исключение (C++):

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Realloc выделяет память для массива int и не выделяет память для массива double - C++
Скажите пожалуйста, почему вот этот код работает: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main()...

исключение - C++
Првиет. Почему не работает такая конструкция? #ifndef TREEEXCEPTION_H #define TREEEXCEPTION_H #include &lt;exception&gt; #include...

исключение в if - else - if - C++
Получает беру отрезок от -10 до 10,шаг 1,вычисляется 2-й вариант и получается 1 ра з деление на нуль,я делаю исключение ,но не выдаёт...

исключение - C++
Допустим у нас есть такая программа: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;fstream&gt; #include &lt;string&gt; using...

Исключение - C++
Здравствуйте, помогите вставить в эту задачу исключения (числа не должны быть меньше равны 0). Задание вроде и не сложное но при...

6
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 23:34 #2
а файл input.txt где?
0
gor2521
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 8
19.09.2012, 23:36  [ТС] #3
Цитата Сообщение от DU Посмотреть сообщение
а файл input.txt где?
Я, его, выставлю, конечно, но это разве суть важно?
Хотя, да, и в нем могут крыться тайны...
0
Вложения
Тип файла: txt input.txt (65 байт, 3 просмотров)
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 23:56 #4
все важно.
по сути - сами себе жизнь усложнили. советую переписать код. вместо динамических массивом символов использовать std::string. кода будет меньше, он будет понятнее и баги быстрее уйдут.
нифига не понял что вообще делается. по быстрому попробовал залечить повреждение памяти.
что сделал:
между строкой 22 и 23 вставляем
curParent[0] = 0;
это хоть начнет влиять на другое место, которое тоже какое-то непонятное и его я подправил
C++
1
2
3
4
5
6
7
8
9
10
  FolderListItem(char *folderName, int folderLevel, char *parentFolderName,FolderListItem* nextFolder = NULL)
  {
    strcpy_s(name, MAX_FOLDER_NAME, folderName);
    if (parentFolderName != NULL)
      // почему MAX_FOLDER_NAME * 30 ???
      //strcpy_s(parentName, MAX_FOLDER_NAME * 30, parentFolderName);
      strcpy_s(parentName, MAX_FOLDER_NAME, parentFolderName);
    level = folderLevel;
    next = nextFolder;
  }

После этого начало падать в месте удаления массивом. т.е. трабла осталась и проявилась по другому или просто новая проблема вылезла. Разбираться лениво.
Короче год - говно (не обижайтесь). Есть какие-то причины не использовать std::string? Если нет, то перепишите, используйте std::string и не будет проблем с ручным управлением памяти и копированием, с которыми вы скорее всего и намудрили (там на еденичку больше положенного скопировали, сям что-то не так сделали.)
1
gor2521
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 8
20.09.2012, 00:26  [ТС] #5
Спасибо.


Цитата Сообщение от DU Посмотреть сообщение
// почему MAX_FOLDER_NAME * 30 ???
Если не риторический вопрос, то это я баловался там так, ну вообщем не суть важно =)

Хорошо, я попробую (но чуть позже) переделать через c++ строки. Причина выбора c-строк впринципе отсутствовала, но т.к. по программе (в группе у меня) пишут на C, я решил использовать их...Вы можете что-нибудь сказать про разницу скорости работы с первыми и вторыми строками?

Цитата Сообщение от DU Посмотреть сообщение
Короче год - говно
Уязвленно принимаю за истину

А насчет того, что вообще там происходит...Это тоже всего-лишь чисто мое решение задачи.
По заданию, для такого инпута, например

F\Games\Driver\Nfs
F\Games\Pic\Abc
F\Prog\You
Нужно вывести
F
*Games
***Driver
****Nfs
***Pic
****Abc
*Prog
***You
Ну вот я и реализую это через связный список...Тащемта не так уж важно, но если у вас есть грандиозные идеи, то можно делиться! =)

Спасибо за помощь и за потраченное время ещё раз.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.09.2012, 00:38 #6
разница в скорости тех и других строк такая, что вы врятли в своей программе ее заметите.
сперва напишите корректную программу, и уже потом оптимизируйте, если без оптимизации прям совсем никуда. никому не нужна неправильноработающая программа, даже если она очень быстро неправильно работает. с правильной хотябы что-то делать можно, пусть даже медленно. но, повторюсь, в вашем случае разницу вы врятли заметите.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
class FolderItem
{
  // folder specifid data
};
 
 
struct ListNode
{
   FolderItem item;
   ListNode* prev;
   ListNode* next;
};
1
gor2521
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 8
20.09.2012, 00:45  [ТС] #7
Вас понял!

Спасибо. Буду переделывать постепенно. Доброй ночи!
0
20.09.2012, 00:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 00:45
Привет! Вот еще темы с ответами:

Не ловится исключение - C++
Не ловится исключение, если нет интернет-соединения... Или при этом вовсе не исключение возникает?.. try { ...

Выкидывает исключение - C++
Вызвано исключение по адресу 0x000000013F292F77 в ConsoleApplication2.exe: 0xC0000005: нарушение прав доступа при записи по адресу...

Необработанное исключение - C++
Здравствуйте! Задачу см. во вложениях. Мой код: заголовочный файл: #include &lt;string&gt; #include &lt;iostream&gt; using...

Необработанное исключение - C++
Здравствуйте! При полном заполнении массива пятью значениями, программа зависает ненадолго, и выскакивает ошибка (см.вложение). Такжево...


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

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

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