Sự khác biệt giữa new và malloc ()

Tác Giả: Laura McKinney
Ngày Sáng TạO: 1 Tháng Tư 2021
CậP NhậT Ngày Tháng: 5 Có Thể 2024
Anonim
Sự khác biệt giữa new và malloc () - Công Nghệ
Sự khác biệt giữa new và malloc () - Công Nghệ

NộI Dung


Cả new và malloc () đều được sử dụng để phân bổ động bộ nhớ. Mặc dù, new và malloc () khác nhau ở nhiều nhược điểm. Sự khác biệt chính giữa new và malloc () là Mới là toán tử, được sử dụng như một cấu trúc. Mặt khác, malloc () là một chức năng thư viện tiêu chuẩn, được sử dụng để phân bổ bộ nhớ trong thời gian chạy. Sự khác biệt khác giữa chúng được thảo luận dưới đây trong biểu đồ so sánh:

  1. Biểu đồ so sánh
  2. Định nghĩa
  3. Sự khác biệt chính
  4. Phần kết luận

Biểu đồ so sánh

Cơ sở để so sánhMớimalloc ()
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ì nó phân bổ đủ 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ạoToá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.
Sự thất bạiKhi 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.
Tái phân bổ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ànhToá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

Nhà điều hành Mới là một 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 ()

Các 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, loại tiếp theo, nhập kiểu để đưa con trỏ tới 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 kiểu mt 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ớ rồi, 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.

  1. 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ợ.
  2. 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ử định 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ổ.
  3. 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.
  4. Toán tử ’mới có thể bị quá tải nhưng malloc () không thể.
  5. 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.
  6. 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 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 ().
  7. Khi bộ nhớ được phân bổ bằng toán tử mới, dù sao thì nó cũng có thể được 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 ().
  8. 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 ().