Anutka369
1

Ошибка очистки динамической памяти

17.11.2010, 14:42. Показов 1322. Ответов 2
Метки нет (Все метки)

Добрый день!
Пожалуйста подскажите? что я делаю не так?
Записываю небольшой текст в RichEdit, считываю его в динамический массив, провожу необходимые операции, затем очищаю этот массив.
Все прекрасно работает!
Если ввожу большой текст, также все операции выполняю, при очистке ругается: "Access violation...".

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
AnsiString s_edit3, s_rich3, s_rich4;
int dlina_r3, dlina_r4;
int kol_str;
float kol_sovp=0;
int r=0;
int freq[33];
for(int a=0; a<33; a++)
    freq[a]=0;
for(int a=0; a<15; a++)
    mass2[a]=0;
 
char *s_rich_c;  
char *s_rich_new2; 
 
kol_str=RichEdit2->Lines->Count;
 
for(int i=0;i<kol_str;i++)
   {
   s_rich3+=RichEdit2->Lines->Strings[i];
   }
dlina_r3=strlen(s_rich3.c_str());
s_rich_c=new char(dlina_r3);
s_rich_c=s_rich3.c_str();
 
for(int n=0; n<dlina_r3; n++)
   {
    if(s_rich_c[n]!=' ')
       {
        s_rich4+=s_rich_c[n];
       }
    }
 
dlina_r4=strlen(s_rich4.c_str());
s_rich_new2=new char(dlina_r4);
s_rich_new2=s_rich4.c_str();
//частота букв
for(int i=0; i<dlina_r4; i++)
    {
     for(int j=0; j<33; j++)
       {if (s_rich_new2[i]==mass[j])
         {freq[j]++;
          break;
         }
       }
 
    }
 
int p=dlina_r4-1;
for(int j=0; j<15; j++)
  {for(int k=0; k<dlina_r4; k++)
      {if((k+j+1)<=p)
          {if(s_rich_new2[k]==s_rich_new2[k+j+1])
           mass2[j]=mass2[j]+1;
           }
       else
           {if(s_rich_new2[k]==s_rich_new2[k+j-p])
            mass2[j]=mass2[j]+1;
           }
 
      }
StringGrid2->Cells[1][j+1]=mass2[j];
kol_sovp+=mass2[j];
}
Label1->Caption=kol_sovp;
float dola=0;
for(int j=1;j<16;j++)
  {
  dola=mass2[j-1]/(2*kol_sovp);
  StringGrid2->Cells[2][j]=FloatToStrF(dola, ffFixed, 4, 3);
  }
int sred_zn=kol_sovp/15;
int max=0, i=0, mass3[15];
for(int j=0; j<15; j++)
   {
    if(mass2[j]>max)
      {
      max=mass2[j];
      }
    if(mass2[j]>(sred_zn+2))
      {
       kol_sred_max++;
       mass3[i]=mass2[j];
       mass_ind[i]=j+1;
       i++;
      }
   }
for (int i=0; i<kol_sred_max; i++)
{
ComboBox1->Items->Add(mass3[i]);
}
 
delete [] s_rich_c;
[COLOR="Red"]delete [] s_rich_new2;[/COLOR]
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2010, 14:42
Ответы с готовыми решениями:

Ошибка динамической памяти при компиляции
При нажатии баттона не компилирует по памяти, в чем может быть ошибка? Во вложение картинка...

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

Выделение динамической памяти
Задан граф в виде матрицы смежности вершин. Найти число компонент связности в этом графе....

Инспектор динамической памяти процессов
Здравствуйте! Помогите пожалуйста. Нужно сделать &quot;Инспектор динамической памяти процессов&quot;. Может у...

2
Эксперт С++
3950 / 1805 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
17.11.2010, 14:52 2
Anutka369, подход к решению проблему неверен.
Класс String (AnsiString, UnicodeString) является сам по себе динамическим контейнером для хранения текста любого размера.
При внесении текста больших размеров массив динамически расширяется, без участия программиста.
Вы же пытаетесь создать целый массив подобных объектов. Зачем?
Скорее всего, вы перепутали тип данных с char или же wchar_t.

Небольшой пример:
C++
1
2
3
4
5
6
String Temp = "Very LongLongLongLong ... Text";
char *Text = new char [Temp.Length()+1]; // не забывайте про нуль-терминатор
strcpy(Text,Temp.t_str()); // вместо t_str() может быть использовать c_str() - зависит от версии IDE и использования юникода
ShowMessage(Text);
delete []Text;
Text = NULL;
К тому же, если вы всё же намерены использовать массивы объектов класса String, то не забывайте о том, что объекты создаются в области динамической кучи:
C++
1
2
3
4
5
String *List = NULL;
List = new String[10];
// действия
delete []List;
List = NULL;
Также, советую обратить внимание на класс TStringList, который сам по себе является хранилищем строк.
0
Anutka369
18.11.2010, 01:55 3
Спасибо большое! Все работает!
Нашла еще одну ошибку, из-за которой все вылетало: когда задавала динамический массив использовала круглые скобки ...
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2010, 01:55
Помогаю со студенческими работами здесь

Ошибка очистки памяти после ввода динамического массива char
Уважаемые форумчане, помогите, пожалуйста. Вроде такой темы на форуме нет. Нужно, дословно, по...

Ошибка с выделением динамической памяти
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class Vector { private: int...

Ошибка освобождения динамической памяти
Столкнулся с проблемой ошибка при очистке динамической памяти помогите разобраться что я сделал не...

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


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

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

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