0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
1

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

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

Author24 — интернет-сервис помощи студентам
Когда я пытаюсь выделить память двумерному динамическому массиву, возникает ошибка "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;
};
};
Зы: Прошу прощение за оформление, я пишу первый раз на подобном форуме.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2008, 09:54
Ответы с готовыми решениями:

Ошибка выделения памяти
Добрый день , у меня проблема с выделением памяти 2-х мерному массиву. В общем такая конструкция....

Ошибка выделения памяти
char * host; host = (char*)malloc(wcslen(_host)); // выделяю память...

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

Ошибка выделения памяти(?)
Первый перечень(Который perech) записывается нормально,а вот второй(makeperech) крашит(объявления...

19
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);
}
Ну и вызовы подправил, но ошибка осталась
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.04.2008, 10:11 3
а количество строк у тебя значение, отличное от нуля ... ты прогу трассерни и глянь, что функция подсчета строк возвращает...
0
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 10:22  [ТС] 4
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
а количество строк у тебя значение, отличное от нуля ... ты прогу трассерни и глянь, что функция подсчета строк возвращает...
Всё норм. Она число возвращает (правельное).
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.04.2008, 10:26 5
так правильно, ты выделяешь неправильно, тебе надо выделить сначала колво твоих строк, ну а потом в цикле каждой из них выделить еще памяти, у тебя сейчас объявляется только кол-ко строк в массиве, но сами строки без памяти... у тебя же указатель на массив строк...
0
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))
...
я ж вроде написал, что подправил этот момент. Или я чегото не понимаю?
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
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]; - это память для каждой строки
а у тебя есть кол-во строк, но каждой из них памяти нет, поэтому компилер ругается... хотя он в таком случае должен ругаться во время выполнения... у тебя же двойной указатель, значит и памяти надо дважды выделять... и вообще лучше юзать динамическое выделение, чем статическое...
0
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 10:47  [ТС] 8
Ваззап Мега Спс! Я просто не знал про "malloc". Ламер я пока ещё
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.04.2008, 10:50 9
ну как говорится, век живи - век учись...
0
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 10:53  [ТС] 10
Гы Тока он теперь на
Код
for(int i=0; i < Strok; i++) Rasb_Text = newchar[256];
ругается Тойже ошибкой, во время исполнения.
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.04.2008, 11:03 11
упс, пардон... я виноват... там надо писать Rasb_Text[i] = newchar[256];
а вообще корректней будет писать выделение маллоком... т.е. под размер конкретной строки...
0
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)
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
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";
  }
}
0
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; }
завершает процедуру при первом же проходе
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.04.2008, 12:24 15
я попорчен билдером, где написано куча классов, чтобы таких заманух не было...
выделяешь ты количество байт маллоком... а в хелпе написано, что null фунция возвращает либо при 0 размере, либо, когда не хватает памяти (честно сам не пойму, что бы это значило)
0
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 12:40  [ТС] 16
Гы Типа аперативки 2 метра, а ты выделяешь 3
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.04.2008, 12:44 17
ну сам понимаешь, что функция эта древняя, может в то время такие проблемы и были, хотя я не догоняю, отчего у тебя память просто на 256 байт возвращает NULL... а на чем ты пишешь прогу?
0
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 12:48  [ТС] 18
На MS Visual C++ 2005
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.04.2008, 12:56 19
слушай, а там же есть класс СString, чтобы не морочится с выделениями и прочей ерундой, связанной с массивом символов
0
0 / 0 / 0
Регистрация: 17.04.2008
Сообщений: 12
17.04.2008, 13:11  [ТС] 20
Возможно и есть... Тока я язык пока знаю очень плохо и с этим классом ещё не сталкивался.
0
17.04.2008, 13:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2008, 13:11
Помогаю со студенческими работами здесь

Ошибка выделения памяти
Извиняюсь за то, что не умею гуглить. =) vector&lt;double&gt; v; v.resize(1000500);...

Ошибка выделения динамической памяти
IDE VS 2015. Собственно есть решение, состоящее из двух проектов. Первый это статическая...

Ошибка выделения памяти для двумерного массива
void create(int **Matrix, int n, int m) { Matrix=new int*; for(int i=0; i&lt;n; i++) Matrix...

Утечки памяти без выделения памяти?
Человек использует _CrtDumpMemoryLeaks() для отлова утечек, и обратился ко мне в сязи с тем, что...

Динамическое выделения памяти
Не совсем понимаю как работает данный кусок кода char *pchar = new char, c; ...

Смысл выделения памяти
Здравствуйте! В Qt принято под все объекты выделять динамическую память! Все методы, в основном,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru