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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
#1

Ошибка выделения памяти... - C++

17.04.2008, 09:54. Просмотров 2533. Ответов 19
Метки нет (Все метки)

Когда я пытаюсь выделить память двумерному динамическому массиву, возникает ошибка "Microsoft C++ exception: std::bad_alloc at memory location...". Вобщем суть того что я делал: Мне нужно считать 2 текстовых файла в кодировке ANCI, построчно их сравнить, ну и сделать ещё ряд действий, до которых я ещё не дошёл... Вобщем я создаю класс, который должен заниматься считыванием и разбиением. В нём есть 2 динамических массива символов (char). В первый массив записывается информация из файла, во второй (он 2 мерный) построчно переписывается текст из первого массива (в идеале). Под 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
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
#pragma once
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include "ObClassov.h"
 
class Text 
{
protected:
int Strok;
char *Full_Text;
int Kol_strok (char *Full_Text); 
public:
char *Razb_Text;
void Loading (char *File_Name);
void drobilka_texta (char *Full_Text, int &Strok, char *Razb_Text);
}
 
void Text::Loading (char *File_Name)
{ 
FILE *fp;
int index=0, Otv=0;
//Открытие файла с проверкой на открываемость
while ((fp=fopen (File_Name, "rt"))==NULL) 
{ 
printf ("\n [COLOR=darkred]Аблом! файл не открывается. 0- выход, 1 - продолжить: "); 
scanf ("%d", Otv);
if (Otv==0) return;
}
Full_Text = newchar [sizeof (fp)]; //Выделение памяти под базовый текст
while (feof (fp)==0) //Заполнение базового текста 
{
Full_Text[index]=fgetc (fp);
if (Full_Text[index] == '\0') break;
index++;
}
 
fclose (fp);
 
drobilka_texta (Full_Text, Strok, Razb_Text); //Вызов процедуры дробления текста}
 
void Text::drobilka_texta (char *Full_Text, int &Strok, char *Razb_Text)
{
int NStroki=0, Nach_Simvol = 0;
int NSimvola = 0, i;
int index;
//Выделение памяти под "разбитый" текст
Strok = Kol_strok (Full_Text);  //определение, сколько выделять
Razb_Text = newchar [Strok]; //выделение. Тут возникает ошибка :(
 
index = 0;
while (index <= strlen (Full_Text))
{
if (Full_Text[index] == '\n')
{
NSimvola = 0;
Razb_Text [NStroki] = newchar [index - Nach_Simvol];
for (i = Nach_Simvol; i < index; i++) 
{
Razb_Text [NStroki][NSimvola] = Full_Text[i];
NSimvola++;
}
NStroki++;
Nach_Simvol = index; 
}
index++;
}
 
int Text::Kol_strok (char *Full_Text)  //Определение кол-ва строк
{
int index = 0, Kol_strok = 0;
while ( index <= strlen (Full_Text) || Full_Text [index] == '\0') 
{
if (Full_Text [index] == '\n') Kol_strok++;
index++;
} 
return Kol_strok;
};
};
Зы: Прошу прощение за оформление, я пишу первый раз на подобном форуме.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 10:07  [ТС]     Ошибка выделения памяти... #2
ЗыЗы: Сорри... Небольшая поправка:
C++
1
2
3
4
5
6
7
8
9
10
11
class Text 
{
protected:
int Strok;
char *Full_Text;
int Kol_strok (char *Full_Text); 
public:
char **Razb_Text;
void Loading (char *File_Name);
void drobilka_texta (char *Full_Text, int &Strok, char **Razb_Text);
}
Ну и вызовы подправил, но ошибка осталась
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 10:11     Ошибка выделения памяти... #3
а количество строк у тебя значение, отличное от нуля ... ты прогу трассерни и глянь, что функция подсчета строк возвращает...
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 10:22  [ТС]     Ошибка выделения памяти... #4
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
а количество строк у тебя значение, отличное от нуля ... ты прогу трассерни и глянь, что функция подсчета строк возвращает...
Всё норм. Она число возвращает (правельное).
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 10:26     Ошибка выделения памяти... #5
так правильно, ты выделяешь неправильно, тебе надо выделить сначала колво твоих строк, ну а потом в цикле каждой из них выделить еще памяти, у тебя сейчас объявляется только кол-ко строк в массиве, но сами строки без памяти... у тебя же указатель на массив строк...
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 10:32  [ТС]     Ошибка выделения памяти... #6
Ты имеешь в виду сделать
C++
1
2
3
4
5
6
...
Razb_Text = new char *[Strok];//выделение. Тут возникает ошибка :(
 
index = 0;
while (index <= strlen (Full_Text))
...
я ж вроде написал, что подправил этот момент. Или я чегото не понимаю?
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 10:37     Ошибка выделения памяти... #7
это должно выглядеть примерно так:
Код
Razb_Text = (char**)[COLOR=#0000ff]malloc([/COLOR][SIZE=2]Strok); - это кол-во строк[/SIZE]
for(int i=0; i < Strok; i++) Rasb_Text = newchar[256]; - это память для каждой строки
а у тебя есть кол-во строк, но каждой из них памяти нет, поэтому компилер ругается... хотя он в таком случае должен ругаться во время выполнения... у тебя же двойной указатель, значит и памяти надо дважды выделять... и вообще лучше юзать динамическое выделение, чем статическое...
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 10:47  [ТС]     Ошибка выделения памяти... #8
Ваззап Мега Спс! Я просто не знал про "malloc". Ламер я пока ещё
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 10:50     Ошибка выделения памяти... #9
ну как говорится, век живи - век учись...
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 10:53  [ТС]     Ошибка выделения памяти... #10
Гы Тока он теперь на
Код
for(int i=0; i < Strok; i++) Rasb_Text = newchar[256];
ругается Тойже ошибкой, во время исполнения.
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 11:03     Ошибка выделения памяти... #11
упс, пардон... я виноват... там надо писать Rasb_Text[i] = newchar[256];
а вообще корректней будет писать выделение маллоком... т.е. под размер конкретной строки...
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 11:32  [ТС]     Ошибка выделения памяти... #12
Хм... Ещё 1 проблема вылезла malloc память криво выделяет. Строка
C++
1
Razb_Text = (char**) malloc (Strok);
выделяет память по адресу 0x00000000... я конечно не уверен, но помоему это ошибка, потомучто дальше, выделяя память под строки циклом
C++
1
for(int i=0; i < Strok; i++) Razb_Text [i] = (char*) malloc (256);
Возникает ошибка обращения по адресу ( Access violation writing location 0x00000000). Оператор new пробовал место аллока, но он выдал прежнюю ошибку (std::bad_alloc at memory location 0x0012fc00)
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 11:48     Ошибка выделения памяти... #13
Razb_Text = (char**) malloc (Strok*256);
Access violation writing location 0x00000000 - это исключительная ситуация, обозначающая обращение к неинициализированной памяти...

вот проверил, пример работы с такими строками:
Код
int main()
{
  int cnt = 0;
  std::cin >> cnt;
  char** text = (char**) malloc(cnt*256);
  for(int i = 0; i < cnt; i++){
    text[i] = (char*) malloc(cnt*256);
    std::cin >> text[i];
  }
  for(int i = 0; i < cnt; i++){
    std::cout<< i << ": "<< text[i]<<"\n";
  }
}
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 12:06  [ТС]     Ошибка выделения памяти... #14
Ок... Почти врубился (во всяком случае код не эррорит. Тока недогоняю... В mallic подаётся количество бит выделяемое под данную "переменную" ? или что? Просто строка:
C++
1
for(int i=0; i < Strok; i++) if ((Razb_Text [i] = (char*) malloc (256*8)) == NULL) return
робит нормально, а строка
C++
1
2
for(int i=0; i < Strok; i++) 
{if ((Razb_Text [i] = (char*) malloc (256)) == NULL) return; }
завершает процедуру при первом же проходе
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 12:24     Ошибка выделения памяти... #15
я попорчен билдером, где написано куча классов, чтобы таких заманух не было...
выделяешь ты количество байт маллоком... а в хелпе написано, что null фунция возвращает либо при 0 размере, либо, когда не хватает памяти (честно сам не пойму, что бы это значило)
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 12:40  [ТС]     Ошибка выделения памяти... #16
Гы Типа аперативки 2 метра, а ты выделяешь 3
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 12:44     Ошибка выделения памяти... #17
ну сам понимаешь, что функция эта древняя, может в то время такие проблемы и были, хотя я не догоняю, отчего у тебя память просто на 256 байт возвращает NULL... а на чем ты пишешь прогу?
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 12:48  [ТС]     Ошибка выделения памяти... #18
На MS Visual C++ 2005
Lord_Voodoo
Супер-модератор
8577 / 2177 / 61
Регистрация: 07.03.2007
Сообщений: 10,863
Завершенные тесты: 1
17.04.2008, 12:56     Ошибка выделения памяти... #19
слушай, а там же есть класс СString, чтобы не морочится с выделениями и прочей ерундой, связанной с массивом символов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2008, 13:11     Ошибка выделения памяти...
Еще ссылки по теме:

По поводу динамического выделения памяти C++
C++ Vector-коэфицинт выделения памяти
Стратегия выделения/освобождения памяти C++
C++ Динамическое выделения памяти
C++ Ошибка выделения памяти(?)

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

Или воспользуйтесь поиском по форуму:
Svarog9
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 13:11  [ТС]     Ошибка выделения памяти... #20
Возможно и есть... Тока я язык пока знаю очень плохо и с этим классом ещё не сталкивался.
Yandex
Объявления
17.04.2008, 13:11     Ошибка выделения памяти...
Ответ Создать тему
Опции темы

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