Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki, turiu klausimą dėl c++. Kadangi esu savamokslis ir mokinuos iš interneto, užstrigau už new/delete skilties. Nuoroda.

1. Kam naudojoma new/delete?

2. Ar jie būtini programuojant?

3. Kaip juos naudot?

4. Kuo skiriasi new/delete nuo new[]/delete[]?

5. Kam nuodojama * apibrėžiant kintamuosius? pvz:

int * p;

6. Gal kas galėtumėt paaiškinti šitą:

p= new (nothrow) int[i];

7. Ar būtina delete pabaigoj?

 

Žinau, kad daug klausimų, bet tikiuosi padės kas nors bent po 1 :)

 

Dėkui :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose
1. Kam naudojoma new/delete?

Šie operatoriai naudojami skirti ir atlaisvinti dinaminę atmintį.

 

2. Ar jie būtini programuojant?

Nebūtini, tačiau naudoti patogu, kai programos pradžioje nėra žinomas reikalingas atminties dydis (pvz.: duomenys iš failo).

 

3. Kaip juos naudot?

Pavyzdys su vienmačiu masyvu:

// Atminties skyrimas:
int kiekis = 5;
int *skaiciai = new int [kiekis];

// Atlaisvinimas
delete [] skaiciai;

 

4. Kuo skiriasi new/delete nuo new[]/delete[]?

`new/delete` - vienam elementui.

`new[]/delete[]` - keliems elementams (pvz.: masyvams)

 

5. Kam nuodojama * apibrėžiant kintamuosius?

Žvaigždutės operatorius nurodo, kad kintamajame bus saugomos nurodyto tipo kintamojo adresas.

 

6. Gal kas galėtumėt paaiškinti šitą:
p= new (nothrow) int[i];

Gali būti atvejų, kai nepavyksta skirti dinaminės atminties (pvz.: pamėgink taip sukurti labai didelį masyvą, kuris užimtų labai daug atminties). Tam įvykus, programa išveda išimtį (exception). Operatorius `nothrow` nurodo, kad įvykus klaidai, programa neišmestų išimties.

 

7. Ar būtina delete pabaigoj?

Būtina nėra, tačiau rekomenduojama, nes taip programa išlaisvina atmintį.

Redagavo g3dut1s
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Būtina nėra, tačiau rekomenduojama, nes taip programa išlaisvina atmintį.

Šiaip jau visada reikėtų naudoti delete. Įsivaizduok, kad tavo programa veikia ilgą laiką (valandą, parą, savaitę, ...) ir neatlaisvina atminties, o tik paskiria dar, dar, dar... Galų gale (protinga) OS tiesiog nutrauks tavo programą.

 

Su paprastais stack masyvais

int skaiciai[100];

viskas paprasta: funkcija baigiasi, atmintis anksčiau ar vėliau atsilaisvina (o ir šiaip stack'as ribotas). Su dinamine atmintimi kitaip – turi prižiūrėti kiekvieną alokavimą ir jiems prirašyti atitinkamus delete ar delete[] (jei kuri masyvą, bet naudoji paprastą delete – turėtų būti negerai).

 

Į pointerius (tuos su žvaigždute) taip pat įsigilink – jie C ir C++ labai reikalingi. Dinaminė atmintis, masyvai, pointer arithmetic, ir kt. :)

 

Pvz. iš esmės nėra tokio dalyko, kaip masyvo perdavimas į funkciją ar grąžinimas iš jos. „Už užuolaidos“ viskas vyksta taip, jog perduodamas pointeris į pirmą masyvo elementą (kiti išsidėstę paeiliui atmintyje, todėl juos paprasta pasiekti, turint pirmojo adresą). Lygiai taip pat galbūt pasirodė keistas new elgesys – prašai masyvo, o atiduoda pointerį :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

y turėtų būti deklaruotas kaip rodyklė į int

int*

O ne kaip tiesiog int.

 

int x;
int *y;
y = &x; //  Kintamajam y priskiriamas kintamojo x adresas
*y = x; // Kintamajam, į kurio atminties vietą rodo y (x'ui), priskiriamas jis pats.
// T.y., jei čia būtum rašęs x = x, būtų tas pats efektas.

*y = &x // neturi prasmės – *y yra int, &x yra int* tipo.

 

Kaip čia paprastai pasakius. Jei y storina būtent adresą, o ne pačią reikšmę

int x = 10;
int *y = &x;

Tai jeigu keisis y:

y = 20;
// x == 10, y == 20

Tai tiesiog y rodys į atminties laukelį, kurio numeris 20 (tikriausiai į kažką nesąmoningo, neleistiną atmintį).

 

Tam, kad „prisikastum“ prie to elemento, į kurį rodo, reikia dereference operatoriaus (tos pačios žvaigždutės)

int x = 10;
int *y = &x;

*y = 20

// x == 20, y == &x (nesikeičia)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...