Làm thế nào để làm việc với phân bổ bộ nhớ động C ++?



Bài viết này khám phá Phân bổ bộ nhớ động Trong C ++, một tính năng quan trọng cho phép bạn xem xét nhu cầu bộ nhớ của mình đối với tài nguyên thời gian thực.

Phân bổ bộ nhớ động Trong C ++ là một tính năng rất quan trọng cho phép bạn xem xét các yêu cầu của mình để giải quyết nhu cầu về tài nguyên thời gian thực. Trong bài viết này, chúng tôi sẽ khám phá Khám phá chi tiết. Những điểm sau sẽ được đề cập trong bài viết này,

Vì vậy, chúng ta hãy bắt đầu với bài viết này về Phân bổ bộ nhớ động trong C ++





Cần cấp phát bộ nhớ động?

Giả sử, chúng ta muốn nhập một câu dưới dạng một mảng ký tự nhưng chúng ta không chắc chắn về số ký tự chính xác được yêu cầu trong mảng.

Bây giờ, trong khi khai báo mảng ký tự, nếu chúng ta chỉ định kích thước của nó nhỏ hơn kích thước của chuỗi mong muốn, thì chúng ta sẽ gặp lỗi vì không gian trong bộ nhớ được cấp cho mảng nhỏ hơn so với kích thước của chuỗi đầu vào. Nếu chúng ta chỉ định kích thước của nó lớn hơn kích thước của chuỗi đầu vào, thì mảng sẽ được cấp phát một không gian trong bộ nhớ lớn hơn nhiều so với kích thước của chuỗi mong muốn, do đó sẽ tiêu tốn nhiều bộ nhớ hơn một cách không cần thiết ngay cả khi nó không được yêu cầu.



Trong trường hợp trên, chúng tôi không có ý tưởng về kích thước chính xác của mảng cho đến thời điểm biên dịch (khi máy tính biên dịch mã và chuỗi được nhập bởi người dùng). Trong những trường hợp như vậy, chúng tôi sử dụng Mới nhà điều hành.

C ++ định nghĩa hai toán tử một ngôi Mớixóa bỏ thực hiện nhiệm vụ cấp phát và phân bổ bộ nhớ trong thời gian chạy. Vì các toán tử này (mới và xóa) hoạt động dựa trên bộ nhớ lưu trữ miễn phí (bộ nhớ Heap), chúng còn được gọi là toán tử lưu trữ miễn phí. Con trỏ cung cấp sự hỗ trợ cần thiết cho hệ thống cấp phát bộ nhớ động trong C ++.

Với sự trợ giúp của Phân bổ động, một chương trình có thể lấy bộ nhớ trong thời gian chạy.



lớp ẩn danh trong java là gì

Các biến cục bộ và toàn cục được cấp phát cho bộ nhớ trong thời gian biên dịch. Tuy nhiên, chúng tôi không thể thêm bất kỳ biến cục bộ hoặc toàn cục nào trong thời gian chạy. Nếu chương trình cần sử dụng một lượng bộ nhớ thay đổi, chúng ta sẽ cần cấp phát bộ nhớ trong thời gian chạy, khi cần thiết. Và tất nhiên, ở đây các quy trình phân bổ động có thể phục vụ mục đích.

Sự khác biệt giữa cấp phát bộ nhớ tĩnh và cấp phát bộ nhớ động:

Đây là kiến ​​trúc bộ nhớ cơ bản được sử dụng cho bất kỳ chương trình C ++ nào:

Bộ nhớ - Phân bổ bộ nhớ động - Edureka

Chúng ta sẽ cần một hình ảnh như thế này

Ngăn xếp được sử dụng để cấp phát bộ nhớ tĩnh và Heap để cấp phát bộ nhớ động, cả hai đều được lưu trữ trong RAM của máy tính.

Các biến được cấp phát trên ngăn xếp trong khi cấp phát bộ nhớ tĩnh được lưu trực tiếp vào bộ nhớ và việc truy cập vào bộ nhớ này rất nhanh, việc cấp phát của nó cũng được xử lý khi chương trình được biên dịch. Khi một hàm hoặc một phương thức gọi một hàm khác, đến lượt nó có thể gọi một hàm khác, v.v., việc thực thi tất cả các hàm này vẫn bị tạm ngưng cho đến khi hàm cuối cùng trả về giá trị của nó. Ngăn xếp luôn được lưu trữ theo thứ tự LIFO (cuối cùng vào trước), khối được đặt trước gần đây nhất luôn là khối tiếp theo được giải phóng. Điều này giúp theo dõi ngăn xếp, giải phóng một khối khỏi ngăn xếp không gì khác hơn là điều chỉnh một con trỏ.

Các biến được phân bổ trên heap được cấp phát bộ nhớ tại thời điểm chạy trong khi cấp phát bộ nhớ động. Truy cập bộ nhớ này chậm hơn một chút so với ngăn xếp, nhưng kích thước của heap chỉ bị giới hạn bởi kích thước của bộ nhớ ảo. Phần tử của heap không phụ thuộc vào nhau và luôn có thể được truy cập ngẫu nhiên vào bất kỳ thời điểm nào. Chúng tôi có thể phân bổ một khối bất cứ lúc nào và giải phóng nó bất cứ lúc nào. Điều này gây khó khăn cho việc theo dõi những phần nào của heap được phân bổ hoặc phân bổ tại bất kỳ thời điểm nào.

Tiếp tục với bài viết này về Phân bổ bộ nhớ động trong C ++

Phân bổ bộ nhớ bằng cách sử dụng Mới Từ khóa

Trong C ++, Mới toán tử được sử dụng để cấp phát bộ nhớ trong thời gian chạy và bộ nhớ được cấp phát theo byte. Các Mới toán tử biểu thị một yêu cầu cấp phát bộ nhớ động trên Heap. Nếu có đủ bộ nhớ thì Mới toán tử khởi tạo bộ nhớ và trả về địa chỉ của bộ nhớ mới được cấp phát và khởi tạo cho biến con trỏ.

Cú pháp:

datatype * pointer_name = new datatype

Thí dụ:

int * ptr = new int // Chúng ta có thể khai báo một biến trong khi cấp phát động theo hai cách sau. int * ptr = new int (10) int * ptr = new int {15} // toán tử new cũng được sử dụng để cấp phát một khối (một mảng) bộ nhớ kiểu dữ liệu kiểu. int * ptr = new int [20] // Câu lệnh trên cấp phát động bộ nhớ cho 20 số nguyên liên tục kiểu int và trả về một con trỏ đến phần tử đầu tiên của dãy thành con trỏ ‘ptr’.

Ghi chú : Nếu heap không có đủ bộ nhớ để cấp phát, yêu cầu mới chỉ ra sự thất bại bằng cách ném một ngoại lệ std :: bad_alloc, trừ khi “nothrow” được sử dụng với toán tử mới, trong trường hợp đó, nó trả về một con trỏ NULL. Do đó, bạn nên kiểm tra biến con trỏ được tạo bởi new trước khi sử dụng nó trong chương trình.

Tiếp tục với bài viết này về Phân bổ bộ nhớ động trong C ++

Phân bổ bộ nhớ bằng cách sử dụng xóa bỏ Từ khóa:

Khi bộ nhớ heap được cấp phát cho một biến hoặc đối tượng lớp bằng cách sử dụng Mới từ khóa, chúng tôi có thể phân bổ không gian bộ nhớ đó bằng cách sử dụng xóa bỏ từ khóa.

Cú pháp:

delete pointer_variable // Ở đây, pointer_variable là con trỏ trỏ đến đối tượng dữ liệu được tạo bởi new. delete [] pointer_variable // Để giải phóng bộ nhớ mảng được cấp phát động được trỏ bởi biến con trỏ, chúng tôi sử dụng hình thức xóa sau:

Thí dụ:

xóa ptr xóa [] ptr

Ghi chú : Phạm vi của đối tượng hoặc thời gian tồn tại của đối tượng là thời gian mà đối tượng vẫn còn trong bộ nhớ trong quá trình thực thi chương trình. Phân bổ bộ nhớ Heap chậm hơn so với ngăn xếp, vì trong heap, không có thứ tự cụ thể nào để bạn có thể cấp phát bộ nhớ trong khi trong ngăn xếp thì nó theo LIFO.

Tiếp tục với bài viết này về Phân bổ bộ nhớ động trong C ++

Mảng phân bổ động

Việc sử dụng chính của khái niệm cấp phát bộ nhớ động là cấp phát bộ nhớ cho một mảng khi chúng ta phải khai báo nó bằng cách chỉ định kích thước của nó nhưng không chắc chắn về nó.

Hãy xem một ví dụ để hiểu cách sử dụng của nó.

#include using namespace std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * mark = new int [len] // Cout cấp phát bộ nhớ động<< 'Enter the marks of each student' << endl for( int i = 0 i>* (mark + i)} for (int i = 0 i

Giải trình:
Trong ví dụ này, đầu tiên chúng ta hỏi người dùng về số lượng học sinh trong một lớp và chúng ta lưu trữ giá trị của nó trong biến len. Sau đó, chúng ta khai báo một mảng số nguyên và cấp phát động cho nó không gian trong bộ nhớ bằng giá trị được lưu trữ trong biến len bằng cách sử dụng câu lệnh này int * mark = new int [length] do đó nó được cấp phát một không gian bằng 'length * (kích thước là 1 số nguyên) '. Phần còn lại của mã là tự giải thích.

Tiếp tục với bài viết này về Phân bổ bộ nhớ động trong C ++

Phân bổ bộ nhớ động cho các đối tượng

Chúng tôi cũng có thể phân bổ động các đối tượng.

Như chúng ta biết rằng Constructor là một hàm thành viên lớp đặc biệt được sử dụng để khởi tạo một đối tượng và Destructor cũng là một hàm thành viên lớp được gọi bất cứ khi nào đối tượng đi ra khỏi phạm vi.

Bộ hủy có thể được sử dụng để giải phóng bộ nhớ được gán cho đối tượng. Nó được gọi trong các điều kiện sau.

  • Khi một đối tượng cục bộ vượt ra khỏi phạm vi
  • Đối với một đối tượng toàn cục, khi một toán tử được áp dụng cho một con trỏ đến đối tượng của lớp

Chúng ta lại có thể sử dụng con trỏ trong khi cấp phát động bộ nhớ cho các đối tượng.

Hãy xem ví dụ về một mảng đối tượng.

#include using namespace std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Đầu ra:

Giải trình:

Constructor sẽ được gọi ba lần vì chúng ta đang cấp phát bộ nhớ cho ba đối tượng của lớp Random. Kẻ hủy diệt cũng sẽ được gọi ba lần trong mỗi đối tượng này. ‘Random * a = new Random [3]’ câu lệnh này chịu trách nhiệm cấp phát bộ nhớ động cho đối tượng của chúng ta.

Như vậy chúng ta đã kết thúc bài viết này về 'Phân bổ bộ nhớ động C ++'. Nếu bạn muốn tìm hiểu thêm, hãy xem bởi Edureka, một công ty học trực tuyến đáng tin cậy. Khóa học đào tạo và cấp chứng chỉ Java J2EE và SOA của Edureka được thiết kế để đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung Java khác nhau như Hibernate & Spring.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của blog này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.

chuyển theo giá trị và chuyển bằng tham chiếu trong java