forum.ge
reklama
FORUM.GE წესები  · დახმარება  · ძებნა  · წევრები  · კალენდარი  · ფოსტა  · ჩატი
  გამოხმაურება · ახალი თემა · ახალი გამოკითხვა

> მეხსიერება Stack, გაუგებრობაში ვარ გამარკვიეთ რა.
syaruna
Crazy Member


*****
ჯგუფი: Members
წერილები: 3111
წევრი No.: 154790
რეგისტრ.: 5-October 12

გამოგზავნილია: 14 Jul 2017, 20:24  #50965146      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
#include<iostream>
using namespace std;
int *f1() {
int c1 = 20;
return &c1;
}
int main() {
int *x=NULL;
x = f1();
cout << "Stack---" <<*x << endl;
return 0;
}

steck-ის მეხსიერებიდან გამომდინარე ფ1 ფუნქცია იშლება სტატიკური მეხსიერებიდან მაგრამ კომპილატორი მაინც მიბრუნებს ფუნქციის მნიშვლენობას და გამომაქვს მეინში შესაბამისად ამ მნიშვნელით სრულიად შესაძლებელია ოპერირება რატომ ხდება ასე?
irakli8
Crazy Member


*****
ჯგუფი: Members
წერილები: 2578
წევრი No.: 125609
რეგისტრ.: 6-January 11

გამოგზავნილია: 14 Jul 2017, 22:05  #50965804      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
წაშლით ის არ იგულისხმება, რომ იმ მისამართზე აღარაფერი იქნება ჩაწერილი, უბრალოდ იმას ნიშნავს რომ გათავისუფლდა ეგ მახსოვრობა და სტეკზე სხვა რაღაცას შეუძლია რომ დაიკავოს, როგორც აქ.
ჰოდა სტატიკურ მეხსიერებას თუ სტეკის მეხსიერებას ეძახი, იგივე არაა.

მიმაგრებული სურათი (გადიდებისთვის დაუწკაპუნეთ სურათზე)
Screenshot__109_.png
syaruna
Crazy Member


*****
ჯგუფი: Members
წერილები: 3111
წევრი No.: 154790
რეგისტრ.: 5-October 12

გამოგზავნილია: 14 Jul 2017, 22:26  #50965936      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
irakli8
მახსოვრობა თუ გათავისუფლდა ფუნქციიდან გამოსვლის დროს ესეიგი მისამართიც წაიშალა *X მა წესით არ უნდა მიიგოს с1 ის მისამართი.
როგორც ჩანს ინფორმაციას დროებით ტოვებს რაგაც არალეგალურს გავს biggrin.gif
და სტატიკური მეხსიერება და სტეკს ერთიდაიგივე მახასიათებლები არ აქვს? მაგიდომ დავაკავშირე..

This post has been edited by syaruna on 14 Jul 2017, 22:28
irakli8
Crazy Member


*****
ჯგუფი: Members
წერილები: 2578
წევრი No.: 125609
რეგისტრ.: 6-January 11

გამოგზავნილია: 14 Jul 2017, 23:59  #50966572      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
syaruna
ეს რომ დაწერო:
CODE

int f(){
 int* i = new int;
 *i = 5;
 return *i;
}

ამ შემთხვევაში კარგავ მისამართს, რაც იმაში გჭირდებოდა რო ეს ახალი აღებული მახსოვრობა გაგეთავისუფლებინა. იმიტორო დინამიურად აღებული მახსოვრობის ფოინთერი თუ დაგეკარგა, სანამ პროგრამა იმუშავებს მანამდე იქნება ეგ მახსოვრობა დაკავებული და საკმარისად ბევრი ეგეთი ცვლადი თუ გქონდა heap-ში ძალიან ბევრ ადგილს დაიკავებს და პროგრამა ან დაიქრაშება ან რამე უფრო ცუდი მოხდება. memory leak ჰქვია ამას.

შენ შემთხვევაში უბრალოდ იღებ ჩვეულებრივი ცვლადი რა მისამართზე ეწერა, ეგ მისამართი არის რიცხვი და ის დაგიბრუნა.

სტატიკური ცვლადები კი სტეკში ხვდება, მაგრამ ჩვეულებრივი სტეკის ცვლადებისგან განსხვავებით, პროგრამის მუშაობის დროს სულ გექნება ეგ მახსოვრობები აღებული. ანუ სქოუფს გარეთ მაშინ გადის როცა პროგრამა ითიშება.
syaruna
Crazy Member


*****
ჯგუფი: Members
წერილები: 3111
წევრი No.: 154790
რეგისტრ.: 5-October 12

გამოგზავნილია: 15 Jul 2017, 00:23  #50966772      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
irakli8
გასაგებია მადლობა ახსნისთვის..
irakli8
Crazy Member


*****
ჯგუფი: Members
წერილები: 2578
წევრი No.: 125609
რეგისტრ.: 6-January 11

გამოგზავნილია: 15 Jul 2017, 00:24  #50966774      · პროფილი · პირადი მიმოწერა · ჩატი · ელფოსტა
syaruna
არაფრის smile.gif
------------
0 წევრი ათვალიერებს ამ თემას (0 სტუმარი და 0 უჩინარი წევრი)
0 წევრი:
Topic Options გამოხმაურება · ახალი თემა · ახალი გამოკითხვა

 



ფორუმის სერვერების განთავსებას და ინტერნეტთან კავშირს უზრუნველყოფს: CLOUD9
[ Script Execution time: 0.5880 ]   [ 13 queries used ]   [ GZIP Disabled ]