C++ dasturlash tili Ko'rsatgichlar, referatlar va dinamik xotira ajratish


Download 267.5 Kb.
bet9/14
Sana20.06.2023
Hajmi267.5 Kb.
#1630767
TuriReferat
1   ...   6   7   8   9   10   11   12   13   14
Bog'liq
Язык программирования C

Динамическое выделение памяти
Создание и Новые функции операторов
Вместо того, чтобы определять переменную () и назначать адрес переменной указателю (), хранилище может быть динамически выделено во время выполнения с помощью оператора. В C++ всякий раз, когда вы динамически выделяете часть памяти с помощью , вам нужно использовать для удаления хранилища (т. е. для возврата хранилища в кучу).intint numberintint *pNumber = &numbernewnewdelete
Операция возвращает указатель на выделенную память. Оператор принимает указатель (указывающий на память, выделенную через ) в качестве единственного аргумента.newdeletenew
Например
// Static allocation
int number = 88;
int * p1 = &number; // Assign a "valid" address into pointer
// Dynamic Allocation
int * p2; // Not initialize, points to somewhere which is invalid
cout << p2 << endl; // Print address before allocation
p2 = new int; // Dynamically allocate an int and assign its address to pointer
// The pointer gets a valid address with memory allocated
*p2 = 99;
cout << p2 << endl; // Print address after allocation
cout << *p2 << endl; // Print value point-to
delete p2; // Remove the dynamically allocated storage
Обратите внимание, что и операторы работают по указателю.newdelete
Чтобы инициализировать выделенную память, можно использовать инициализатор для фундаментальных типов или вызвать конструктор для объекта. Например
// use an initializer to initialize a fundamental type (such as int, double)
int * p1 = new int(88);
double * p2 = new double(1.23);
// C++11 brace initialization syntax
int * p1 = new int {88};
double * p2 = new double {1.23};
// invoke a constructor to initialize an object (such as Date, Time)
Date * date1 = new Date(1999, 1, 1);
Time * time1 = new Time(12, 34, 56);
Вы можете динамически выделять хранилище для глобальных указателей внутри функции. Динамически выделяемое хранилище внутри функции остается даже после выхода из функции. Например
// Dynamically allocate global pointers (TestDynamicAllocation.cpp)
#include
using namespace std;
int * p1, * p2; // Global int pointers
// This function allocates storage for the int*
// which is available outside the function
void allocate() {
p1 = new int; // Allocate memory, initial content unknown
*p1 = 88; // Assign value into location pointed to by pointer
p2 = new int(99); // Allocate and initialize
}
int main() {
allocate();
cout << *p1 << endl; // 88
cout << *p2 << endl; // 99
delete p1; // Deallocate
delete p2;
return 0;
}

Основные различия между статическим и динамическим распределением заключаются в следующем:



  1. При статическом выделении компилятор автоматически выделяет и освобождает хранилище, а также управляет памятью. В то время как при динамическом распределении вы, как программист, сами управляете выделением и освобождением памяти (через операторы и ). У вас есть полный контроль над адресами указателей и их содержимым, а также управление памятью.newdelete

  2. Статические выделенные сущности управляются с помощью именованных переменных. Динамические выделенные сущности обрабатываются с помощью указателей.


Download 267.5 Kb.

Do'stlaringiz bilan baham:
1   ...   6   7   8   9   10   11   12   13   14




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling