C++ dasturlash tili Ko'rsatgichlar, referatlar va dinamik xotira ajratish
Download 267.5 Kb.
|
Язык программирования 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; } Основные различия между статическим и динамическим распределением заключаются в следующем: При статическом выделении компилятор автоматически выделяет и освобождает хранилище, а также управляет памятью. В то время как при динамическом распределении вы, как программист, сами управляете выделением и освобождением памяти (через операторы и ). У вас есть полный контроль над адресами указателей и их содержимым, а также управление памятью.newdelete Статические выделенные сущности управляются с помощью именованных переменных. Динамические выделенные сущности обрабатываются с помощью указателей. Download 267.5 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling