Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 05.06.2015
Сообщений: 6
1

При освобождении памяти под двумерный динамический массив way выскакивает EAcessViolation

05.06.2015, 15:22. Просмотров 545. Ответов 11
Метки нет (Все метки)


Здравствуйте. Помогите, пожалуйста, разобраться с такой проблемой. При освобождении памяти под двумерный динамический массив way выскакивает ошибка EAcessViolation и т.д. Пробовал добавлять этот масив как поле в Form1 в файле Unit1.h. Помогло. Но тогда приходится объявлять этот массив как локальный, а мне он нужен для выполнения других функций (т.е. надо, чтобы был глобальный). Не знаю как разрешить эту проблем. Спасибо за ответы.
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
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int num,way_count,p,k;
float *vloz=new float[num];
int **way=new int*[way_count];
float **a=new float*[num];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Edit1->Text!="")
 {
   num=StrToFloat(Edit1->Text);
 
 for(int i=0;i<num;++i)
      a[i]=new float[num];
 }
}
//--------------------------------------------------------------------------
int fact (int N)
{
    if(N < 0) // если пользователь ввел отрицательное число
        return 0; // возвращаем ноль
    if (N == 0) // если пользователь ввел ноль,
        return 1; // возвращаем факториал от нуля - не удивляетесь, но это 1 =)
    else // Во всех остальных случаях
        return N*fact(N-1); // делаем рекурсию.
}
//---------------------------------------------------------------------------
 
void DFS (int v)
{
 for(int i=0;i<num;++i)
 {
  int flag=0;
  if (v!=i)
   {
    if (a[v][i]!=0)
     {
      if (vloz[0]==0)
       {
        vloz[0]=v+1;
       }
      for(int j=0;j<num;++j)
        if (vloz[j]==i+1)
          flag=1;
      if (flag==0)
       {
        ++k;
        vloz[k]=i+1;
        for(int z=0;z<=k;++z)
         way[p][z]=vloz[z];
        ++p;
        DFS (i);
 
        vloz[k]=0;
        if (k!=0)
           k=k-1;
       }
    }
   }
 }
 
}
 
//-------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 
  way_count=10;
 
  StringGrid2->RowCount=way_count;
  StringGrid2->ColCount=num;
 
  for(int i=0;i<way_count;++i)
      way[i]=new int[num];
 
  for(int i=0;i<way_count;++i)
  {
    for(int j=0;j<num;++j)
        {
         way[i][j]=0;
         StringGrid2->Cells[j][i]=IntToStr(way[i][j]);
        }
  }
 
 // далее выполняется функция  DFS
 
 for (int count = 0; count < way_count; count++)
        delete[] way[count];
 delete[] way;           // ЭТО МЕСТО ПОЯВЛЕНИЯ ОШИБКИ  AEcessViollation ....
 
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2015, 15:22
Ответы с готовыми решениями:

Программа валится при освобождении памяти под динамический массив
Доброго времени суток. Проблема такая. Моя программа представляет собой поразрядную сортировку даты...

Выделение памяти под динамический двумерный массив в структуре
Доброво времени суток, дорогие товарищи-кодеры! Работав проектом, столкнулся с тем что удобно...

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

Ошибка при выделении памяти под двумерный массив
#include &lt;iostream&gt; using namespace std; class array { int size1, size2; char **matr;...

11
управление сложностью
1638 / 1258 / 249
Регистрация: 22.03.2015
Сообщений: 7,334
Записей в блоге: 4
05.06.2015, 15:27 2
Вам видимо с векторами нужно работать, либо со списками. Вы походу задачу не так поняли.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30857 / 20180 / 7873
Регистрация: 22.10.2011
Сообщений: 35,038
Записей в блоге: 6
05.06.2015, 15:28 3
C++
1
2
3
4
int num,way_count,p,k;
float *vloz=new float[num];
int **way=new int*[way_count]; // Чему здесь way_count равен? 
float **a=new float*[num];
какой размер памяти, выделенной под way?
0
0 / 0 / 0
Регистрация: 05.06.2015
Сообщений: 6
05.06.2015, 15:32  [ТС] 4
way_count может быть произвольным. Где-то до 1000.
Я в обработчике Батон2 задал его равным 10.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30857 / 20180 / 7873
Регистрация: 22.10.2011
Сообщений: 35,038
Записей в блоге: 6
05.06.2015, 15:35 5
Это ты его потом задал, а сначала выделил память под way. Вот я и спрашиваю, чего ты ждешь, кроме вылета? Выделяй память тогда, когда значение way_count будет известно.
0
0 / 0 / 0
Регистрация: 05.06.2015
Сообщений: 6
05.06.2015, 15:50  [ТС] 6
В обработчике Батон 2 сначала определен way_count, а потом выполняется выделение памяти в цикле под массив. Или я что-то путаю? Если можно напишите код для чайника.

Добавлено через 12 минут
И если нельзя так выделять память, как это сделал я с массивом way, то почему тогда массив a не вызывает никаких ошибок? Хотя он тоже динамический и значение num задается пользоваетелем.
0
Pure Free Digital Ghost
4214 / 1674 / 323
Регистрация: 06.01.2013
Сообщений: 4,287
05.06.2015, 15:55 7
Цитата Сообщение от Рекрут2012 Посмотреть сообщение
то почему тогда массив a не вызывает никаких ошибок?
Потому что первым делом начинают лезть в массив way

C++
1
2
3
int **way = new int*[way_count];
way_count=10;
for(int i=0;i<way_count;++i) way[i]=new int[num];
Так нельзя.
0
0 / 0 / 0
Регистрация: 05.06.2015
Сообщений: 6
05.06.2015, 16:01  [ТС] 8
В обработчике Батон1 в массив а также лезут

num=StrToFloat(Edit1->Text);
for(int i=0;i<num;++i) a[i]=new float[num];

Почему здесь можно? И Батон1 работает без ошибок.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30857 / 20180 / 7873
Регистрация: 22.10.2011
Сообщений: 35,038
Записей в блоге: 6
05.06.2015, 16:03 9
Цитата Сообщение от Рекрут2012 Посмотреть сообщение
Почему здесь можно?
И здесь нельзя, просто на твоем компьютере в текущей сессии Windows, при этом расположении Луны на небе ошибка еще не проявилась. Будешь ждать, пока проявится, и потом исправлять, или исправишь сразу? Выбирай.
0
0 / 0 / 0
Регистрация: 05.06.2015
Сообщений: 6
05.06.2015, 16:53  [ТС] 10
А в чем тогда динамичность массива, если его размер нужно знать заранее? И как сделать его по-настоящему динамическим, т.е. чтобы пользовател вводил его размерность, и только тогда выделялась память?

Добавлено через 36 минут
Как добиться того, чтобы объявляемый в одном обработчике динамический массив, был глобальным и обрабатывался другими функциями програми?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30857 / 20180 / 7873
Регистрация: 22.10.2011
Сообщений: 35,038
Записей в блоге: 6
05.06.2015, 17:16 11
Динамичность - в том, что размер задается в рантайме, а не на этапе компиляции. Вот к такому:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int way_count;
int **way;
 
// ...
    way_count = way_count = Edit1->Text.ToIntDef(10); // получаешь от пользователя размер
    way = new int*[way_count]; // _после_ того, как получил размер - работаешь с массивом
    for (int i = 0; i < way_count; ++i)
        way[i] = new int[num];
 
    // ...
 
    for (int count = 0; count < way_count; count++)
        delete [] way[count];
    delete [] way;
претензий не будет.
1
0 / 0 / 0
Регистрация: 05.06.2015
Сообщений: 6
05.06.2015, 18:25  [ТС] 12
Спасибо за детальный ответ.
А массив, созданный таким образом, будет локальным или глобальным? Другие функции, кроме той, в которой он объявлен, смогут к нему обращаться?

Добавлено через 7 минут
volvo, огроменное спасибо. Заработало.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2015, 18:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб?
Здравствуйте, знатоки! Столкнулся с проблемой выделения памяти под динамические массивы. При...

При попытке создать динамический одномерный массив, под него выделяется только 8 байт памяти
Доброго времени суток. Проблема в следующем: при попытке создать динамический одномерный массив,...

Переделать программу под двумерный динамический массив
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; #include &lt;cctype&gt;...

Выделение памяти под динамический массив
Нужна помощь, кому не трудно откликнитесь. Нубас вообще в указателях и выделении памяти. ...


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

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

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