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

Происхродит ли здесь возврат указателя на не действительную память? - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.05.2012, 11:17     Происхродит ли здесь возврат указателя на не действительную память? #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
double *Gaus(double **Matix, double *Frees, int N)
{
 double **DownRow;
 double *DownFree;
 int i;
 double **UpnRow;
 double *UpFree;
 double *Main;
 double *AboveMain;
 double k;
 double *DownItem;
 double *UpItem;
 double *x;
 double *Currentx;
 double *Lastx;
 double s;
 double *Previusx;
 double **Row;
 double *Item;
 double *Free;
 for (i=N-1, DownRow=Matix+i, DownFree=Frees+i; DownRow>Matix; --DownRow, --DowFree)
 {
  Main=*DownRow+i;
  for (UpRow=DownRow+1, UpFree=DownFree-1; UpRow>=Matrix; --UpRow)
  {
   AboveMain=*UpRow+i;
   k=*AboveMain/(*Main);
   *AboveMain=0.0;
   for (DownItem=Main-1, UpItem=AboveMain-1; DownItem>=*DownRow; --DownItem, --UpItem)
   {
    *UpItem-=DownItem*k;
   }
   *UpFree-=*DownFree*k;
  }
 }
 if (N>0)
 {
  x=new double [N];
  if (x)
  {
   for (i=0, Lastx=x+i, Currentx=x, Row=Matrix, Free=Frees;  Currentx<=Lastx; +Currentx, ++Row, ++i, ++Free)
   {
    s=0.0;
    Main=*Row+i;
    for (Previusx=Currentx-1, Item=Main-1; Previusx>=x; --Previusx)
    {
     s+=*Previusx*(*Item);
    }
    *Currentx=(*Free-s)/(*Main);
   }
  }
 }
 else
 {
  x=NULL;
 }
 return x;
}
В принципе, x - локальная переменная, а указатели на локальные данные возвращать нельзя, так как эти указатели не действительны из-за неявного уничтожения локальных переменных в момент выхода из функции. Но x - уже указатель на динамические данные и здесь возвращается хоть и указатль, но не на x, а значение x. Можно ли так делать, или возвращённый указатель не действителен и указывает на неявно освобождённую память? То есть уничтожается ли при выходе только сам x, или уничтожается сам x и освобождается всё, что выделено по x?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 11:17     Происхродит ли здесь возврат указателя на не действительную память?
Посмотрите здесь:

C++ Возврат указателя на строку из фукнции
Возврат указателя на массив из функции C++
Получить действительную матрицу C++
C++ Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0]
C++ Возврат функцией указателя на функцию
C++ Возврат указателя
Возврат указателя на массив указателей C++
C++ Получить действительную квадратную матрицу порядка n

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
B.Krols
 Аватар для B.Krols
6 / 6 / 2
Регистрация: 10.02.2012
Сообщений: 21
15.05.2012, 12:23     Происхродит ли здесь возврат указателя на не действительную память? #2
В этом случае освобождается *x из стека при выходе из функции.
То, что Вы веделели в динамической памяти с помощью new, не освобождается. Эту память нужно освобождать явно, с помощью delete.
Поэтому вызов этой функции должен осуществляться примерно так:
C++
1
2
3
4
5
double *x = Gaus(...);
/*do something*/
if ( NULL != x )    {
    delete[] x;
}
Yandex
Объявления
15.05.2012, 12:23     Происхродит ли здесь возврат указателя на не действительную память?
Ответ Создать тему
Опции темы

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