
Biểu đồ so sánh
Cơ sở để so sánh | Mới | malloc () |
---|---|---|
Ngôn ngữ | Toán tử mới là một tính năng cụ thể của C ++, Java và C #. | Hàm malloc () là một tính năng của C. |
Thiên nhiên | "Mới" là một nhà điều hành. | malloc () là một hàm. |
sizeof () | mới không cần toán tử sizeof vì có đủ bộ nhớ cho loại cụ thể | malloc yêu cầu toán tử sizeof biết kích thước bộ nhớ để phân bổ. |
Constructor | Toán tử mới có thể gọi hàm tạo của một đối tượng. | malloc () hoàn toàn không thể thực hiện cuộc gọi đến hàm tạo. |
Khởi tạo | Toán tử mới có thể khởi tạo một đối tượng trong khi phân bổ bộ nhớ cho nó. | Khởi tạo bộ nhớ không thể được thực hiện trong malloc. |
Quá tải | Toán tử mới có thể bị quá tải. | Các malloc () không bao giờ có thể bị quá tải. |
Thất bại | Khi thất bại, nhà điều hành mới ném một ngoại lệ. | Khi thất bại, malloc () trả về NULL. |
Giao dịch | Việc cấp phát bộ nhớ theo mới, được xử lý bằng cách sử dụng "xóa". | Việc cấp phát bộ nhớ cho malloc () được giải quyết bằng cách sử dụng hàm free (). |
Tái phân bổ | Toán tử mới không phân bổ lại bộ nhớ. | Bộ nhớ được cấp phát bởi malloc () có thể được phân bổ lại bằng realloc (). |
Chấp hành | Toán tử mới cắt giảm thời gian thực hiện. | Các malloc () đòi hỏi nhiều thời gian hơn để thực hiện. |
Định nghĩa mới
Toán tử mới là toán tử cấp phát bộ nhớ phân bổ bộ nhớ động. Toán tử mới phân bổ bộ nhớ trong heap và trả về địa chỉ bắt đầu của bộ nhớ đó được gán cho một biến tham chiếu. Toán tử mới tương tự như malloc () trong C. Tuy nhiên, trình biên dịch C ++ tương thích với malloc (), nhưng tốt nhất là sử dụng toán tử mới vì nó có một số lợi thế nhất định so với malloc (). Cú pháp của toán tử mới như sau:
loại biến_name = loại mới (tham số_list);
Ở đây, kiểu gõ biểu thị kiểu dữ liệu của biến mà bộ nhớ phải được phân bổ. Từ biến biến_name tên là tên được đặt cho biến tham chiếu giữ con trỏ tới bộ nhớ. Dấu ngoặc ở đây chỉ định cách gọi của hàm tạo. Tham số_list là danh sách các giá trị được truyền cho hàm tạo để khởi tạo đối tượng mới được xây dựng.
Toán tử mới phân bổ đủ bộ nhớ cần thiết cho một đối tượng của một loại cụ thể. Do đó, nó không yêu cầu toán tử sizeof () cũng như không yêu cầu thay đổi kích thước bộ nhớ như malloc () sử dụng realloc () để phân bổ lại bộ nhớ. Toán tử mới là một cấu trúc; nó gọi hàm tạo của một đối tượng trong khi khai báo thường được sử dụng để khởi tạo đối tượng.
Chúng tôi biết rằng toán tử mới phân bổ bộ nhớ trong heap và kích thước của heap bị giới hạn. Vì vậy, nếu heap hết bộ nhớ và toán tử mới cố gắng phân bổ bộ nhớ, nó sẽ dẫn đến thất bại của toán tử mới. Nếu toán tử mới không cấp phát bộ nhớ, nó sẽ đưa ra một ngoại lệ và nếu mã của bạn không thể xử lý ngoại lệ đó, chương trình sẽ chấm dứt một cách bất thường.
Bộ nhớ được cấp phát bởi toán tử mới có thể được giải phóng bằng toán tử xóa. Toán tử mới cắt thời gian thực hiện vì nó là toán tử, không phải là hàm.
Định nghĩa của malloc ()
Malloc () là một hàm được sử dụng để phân bổ lượng bộ nhớ được yêu cầu trên heap. Phương thức trả về con trỏ của kiểu 'void', hơn nữa, gõ cast để đưa con trỏ đến bộ nhớ của loại đã chỉ định và con trỏ này tới bộ nhớ được gán cho biến tham chiếu. Hàm malloc () tương tự như toán tử mới trong C ++ vì nó được sử dụng để phân bổ bộ nhớ động. Malloc () là một hàm thư viện tiêu chuẩn. Cú pháp của hàm malloc () như sau:
loại biến_name = (loại *) malloc (sizeof (loại));
Ở đây, kiểu gõ Chỉ ra kiểu dữ liệu của biến mà bộ nhớ phải được phân bổ. Biến_name là tên của biến tham chiếu mà con trỏ được trả về bởi malloc () sẽ được gán. (Kiểu *) mô tả việc truyền kiểu để lấy con trỏ tới bộ nhớ theo một kiểu cụ thể. Sizeof () mô tả malloc (), kích thước bộ nhớ là bắt buộc.
Malloc () yêu cầu truyền kiểu vì con trỏ được trả về bởi malloc () là kiểu void, vì vậy, để gán một kiểu cho con trỏ, cần phải nhập kiểu. Sizeof () là bắt buộc vì hàm malloc () cấp phát bộ nhớ thô do đó, cần phải nói với hàm malloc () rằng kích thước bộ nhớ mà nó phải phân bổ. Nếu bộ nhớ được phân bổ không đủ, nó có thể được thay đổi kích thước hoặc phân bổ lại bằng cách sử dụng realloc ().
Hàm malloc () phân bổ bộ nhớ trên heap. Trong trường hợp, heap hết bộ nhớ, hàm malloc () trả về một con trỏ NULL. Do đó, biến tham chiếu có chứa con trỏ được trả về bởi malloc (), nên được kiểm tra trước khi sử dụng, nếu không nó có thể dẫn đến sự cố hệ thống.
Bộ nhớ được cấp phát bởi hàm malloc () được giải phóng bằng cách sử dụng free (). Khi gọi hàm dẫn đến một chi phí chung, malloc () đòi hỏi nhiều thời gian hơn để thực hiện.
Sự khác biệt chính giữa new và malloc ()
- Toán tử mới là một cấu trúc được giới thiệu trong C ++ và được sử dụng trong Java, C #, v.v. Mặt khác malloc () là một hàm thư viện tiêu chuẩn chỉ có trong ngôn ngữ C và được C ++ hỗ trợ.
- Toán tử mới phân bổ đủ bộ nhớ cho đối tượng của một kiểu đã chỉ định, do đó, nó không yêu cầu toán tử kích thước. Mặt khác, hàm malloc () yêu cầu toán tử sizeof () để cho hàm biết rằng kích thước bộ nhớ mà nó phải phân bổ.
- Toán tử mới có thể gọi hàm tạo của đối tượng trong khi khai báo. Mặt khác, hàm malloc () không thể gọi hàm tạo.
- Toán tử 'mới' có thể bị quá tải nhưng malloc () không thể.
- Nếu toán tử mới không cấp phát bộ nhớ, nó sẽ ném một ngoại lệ phải được xử lý bởi mã khác, chương trình sẽ chấm dứt. Mặt khác, hàm malloc () trả về một con trỏ NULL nếu nó không cấp phát bộ nhớ. Nếu con trỏ được sử dụng mà không kiểm tra điều này, nó sẽ dẫn đến sự cố hệ thống.
- Bộ nhớ được phân bổ bằng toán tử mới có thể được giải phóng bằng cách sử dụng 'xóa'. Mặt khác, bộ nhớ được phân bổ bằng hàm malloc () có thể được giải phóng bằng cách sử dụng free ().
- Khi bộ nhớ được cấp phát bằng toán tử mới, dù sao thì nó cũng không thể thay đổi kích thước. Mặt khác, bộ nhớ được phân bổ bằng hàm malloc () có thể được phân bổ lại (thay đổi kích thước) bằng hàm realloc ().
- Thời gian thực hiện của cái mới ít hơn so với malloc () vì malloc là một hàm và new là một cấu trúc.
Phần kết luận:
Hàm malloc () là cách cũ để phân bổ động bộ nhớ. Ngày nay, toán tử mới được sử dụng để phân bổ bộ nhớ trong thời gian chạy vì nó có những lợi thế nhất định so với malloc ().