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

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

Войти
Регистрация
Восстановить пароль
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

15.05.2012, 11:17. Просмотров 297. Ответов 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++
Написать функцию возвращающую ссылку на элемент глобального массива. #include &lt;stdio&gt; #include &lt;conio&gt; #include &lt;iostream&gt; ...

Возврат функцией указателя на функцию - C++
Всем привет! У меня возникла такая проблема: класс имеет поле-указатель на функцию. В методе, который осуществляет доступ к этуму полю,...

Возврат указателя на массив из функции - C++
Здравствуйте. Пытаюсь вернуть указатель на массив из функции. #include &lt;iostream&gt; using namespace std; int*...

Возврат указателя на массив из функции - C++
День добрый, коллеги по цеху. Не откажите в нужде java программисту в познаниях нативного кода. Запутался я совсем в указателях. Как...

Возврат указателя на строку из фукнции - C++
Снова я пришел к вам со строками. Читаю &quot;Как программировать на С++&quot; и там везде пишут про инкапсуляцию, сокрытие данных. Так чтоб мы...

Возврат указателя на локальный объект - C++
Доброго дня! Заинтересовал процесс возврата указателя на локальный объек, а именно: char* fun() { char *ptr1 = &quot;Hello world!&quot;; ...

Возврат указателя на массив указателей - C++
Доброго времени суток. Есть программа, где куча методов должны работать с одни массивом указателей. Как мне сделать, чтобы в функции...

Visual c++ возврат указателя, return *char - C++
есть класс journal, Я передаю в char *name значение &quot;gfg&quot;, а возвращает от мне заименнованное значение name, только первый символ &quot;f&quot;. ...

Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0] - C++
Задан массив из 3 указателей Bitmap, по адресу Bitmap необходимо записать 480*640 элементов из массива Bitmap. В последнем цикле for выдает...

Каким образом выделяется память при инициализации строковой константой указателя - C++
Доброго времени суток. Хотелось бы более подробно узнать некоторые моменты относительно указателей и динамического выделения памяти....


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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     Происхродит ли здесь возврат указателя на не действительную память?
Ответ Создать тему
Опции темы

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