Pointeri în Delphi
Este timpul să vă familiarizați cu indicii. Acesta este un element foarte convenabil al limbajului, pe care îl vom folosi adesea. În acest capitol, vor fi luate în considerare indicii către structuri care se află în memorie dinamică.
Dar, înainte de a explica ceva, să luăm în considerare motivul pentru care sunt necesare indicii. Să ne amintim de proceduri, și anume, cum apare apelul lor. Să presupunem că aveți o procedură numită mupRos care are doi parametri: un număr și un șir. Cum apare o astfel de procedură și cum sunt transmise acești parametri? Este foarte simplu. Mai întâi, parametrii sunt luați în stivă (rețineți că teancul este o zonă de memorie pentru stocarea variabilelor temporare sau locale). Primul parametru este introdus mai întâi, apoi cel de-al doilea, apoi se numește procedura. Înainte de începerea procedurii, procedeul extrage acești parametri din stiva în ordine inversă.
Acum, să ne amintim parametrii noștri. Primul este un număr care va ocupa 2 octeți. Când se scrie în stack, se va pune acolo 2 octeți acolo. Al doilea parametru este un șir. Fiecare caracter din șir este un singur octet. Să presupunem că șirul este format din 10 caractere. Aceasta înseamnă că, pentru linia de transmisie într-o astfel de procedură în stiva va avea nevoie de 10 octeți, plus 1 octet pentru a indica sfârșitul liniei sau dimensiunea (în funcție de tipul de linie). În total, procedura necesită cel puțin 12 octeți pe stivă. Nu e atât de mult, încât să-ți poți permite.
Și dacă trebuie să transferăm în procedură o fotografie de dimensiuni de 3 megabiți? Ce trebuie să copiez la stivă? Cateva poze de inalta calitate - iar stiva se va termina.
Modul de ieșire din această situație este destul de simplu. Nu puteți trece un șir, ci treceți doar un pointer în zona de memorie unde este localizată această linie. Orice indicator are doar 4 octeți, și aceasta este o economie semnificativă. Tocmai am lăsat procedura noastră să știe unde să găsească linia.
Indicatorul din Delphi este declarat drept Pointer. De exemplu, să declarăm o variabilă p de pointer de tip:
var p: Pointer Str: String; începe
p: = @ Str; // Am asignat link-ul la pointer la string Str: = 'Bună ziua prietenului meu'; // Schimbați valoarea liniei Edit1.
Text: = String (p74); // Efectuați sfârșitul textului;
Orice variabila pointer poate fi atribuit o valoare de zero, este nu numai numărul de la 0, un zero - pointer nul, de exemplu, p: = zero (în principiu, zero este același Oh, doar folosit pentru a reseta indicii). Când atribuiți o valoare zero, distrugeți linkul. În mod similar, dacă atribuiți o valoare nulă unei variabile de obiect, o veți distruge. Nu eliminați niciodată indicatorii variabili care indică obiecte existente. Mai întâi distruge obiecte (memorie liberă), apoi aveți posibilitatea să atribuiți un pointer la zero.
TIP. În Windows, nu există nici o culegătorii de deșeuri care există în Java, iar în cazul în care subiectul nu este elibera memorie, atunci acesta va fi pierdut. Există cazuri când indicele de reducere la zero într-adevăr eliberează de memorie, dar nu se întâmplă întotdeauna. De aceea, puteți anula numai obiectele COM (vom vorbi despre ele separat). Anularea lor duce la eliberarea memoriei.