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

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

Восстановить пароль Регистрация
 
gor2521
 Аватар для gor2521
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 8
19.09.2012, 21:27     Динамеческая память. Исключение #1
Всем доброго времени суток!
Предисловие: Имеется задание на связные списки. Суть задания не важна, но вкратце: по входным строкам формировать дерево папок. Используемый мною язык, очевидно, 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: На всякий случай прикрепляю заголовочный файл с описанием класса для списка, файл с его реализацией и мэйн.
Вложения
Тип файла: 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++ Необработанное исключение
Статическая память,Динамическая память. C++
исключение в if - else - if C++
исключение C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 23:34     Динамеческая память. Исключение #2
а файл input.txt где?
gor2521
 Аватар для gor2521
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 8
19.09.2012, 23:36  [ТС]     Динамеческая память. Исключение #3
Цитата Сообщение от DU Посмотреть сообщение
а файл input.txt где?
Я, его, выставлю, конечно, но это разве суть важно?
Хотя, да, и в нем могут крыться тайны...
Вложения
Тип файла: txt input.txt (65 байт, 3 просмотров)
DU
1477 / 1053 / 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 и не будет проблем с ручным управлением памяти и копированием, с которыми вы скорее всего и намудрили (там на еденичку больше положенного скопировали, сям что-то не так сделали.)
gor2521
 Аватар для 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
Ну вот я и реализую это через связный список...Тащемта не так уж важно, но если у вас есть грандиозные идеи, то можно делиться! =)

Спасибо за помощь и за потраченное время ещё раз.
DU
1477 / 1053 / 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;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 00:45     Динамеческая память. Исключение
Еще ссылки по теме:

Исключение C++
C++ Не ловится исключение
C++ Необработанное исключение

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

Или воспользуйтесь поиском по форуму:
gor2521
 Аватар для gor2521
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 8
20.09.2012, 00:45  [ТС]     Динамеческая память. Исключение #7
Вас понял!

Спасибо. Буду переделывать постепенно. Доброй ночи!
Yandex
Объявления
20.09.2012, 00:45     Динамеческая память. Исключение
Ответ Создать тему
Опции темы

Текущее время: 01:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru