2009-04-30 9 views
47

Sự khác biệt giữa "mới" và "malloc" và "calloc" và những người khác trong gia đình là gì?Sự khác nhau giữa "mới" và "malloc" và "calloc" trong C++ là gì?

(Khi nào) Tôi có cần gì khác ngoài "mới" không?

Một trong số chúng có được triển khai bằng cách sử dụng bất kỳ mục đích nào khác không?

+2

Nếu bạn đang sử dụng STL, bạn hiếm khi cần sử dụng phân bổ bộ nhớ rõ ràng. – Brian

+1

Bản sao của http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free –

+0

Kiểm tra câu hỏi được liên kết trùng lặp, vì câu trả lời của nó hoàn chỉnh hơn: http: //stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free –

Trả lời

65

newdelete là các tính năng cụ thể của C++. Chúng không tồn tại trong C. malloc là trường C cũ để làm việc. Hầu hết thời gian, bạn sẽ không cần sử dụng nó trong C++.

  • malloc phân bổ bộ nhớ chưa được khởi tạo. Bộ nhớ được cấp phát phải được phát hành với free.
  • calloc giống như malloc nhưng khởi tạo bộ nhớ được cấp phát bằng hằng số (0). Nó cần được giải phóng với free.
  • new khởi tạo bộ nhớ được cấp phát bằng cách gọi hàm tạo (nếu đó là đối tượng). Bộ nhớ được phân bổ với new phải được phát hành với delete (mà lần lượt gọi là destructor). Nó không cần bạn tự xác định kích thước bạn cần và đưa nó vào loại thích hợp. Vì vậy, nó hiện đại hơn và ít bị lỗi.
+1

Là "không gian đầu" một thuật ngữ bạn vừa phát minh ra? –

+0

@Neil Butterworth: Tôi không biết. Nhưng tôi nghĩ rằng tôi đã đọc nó ở đâu đó ... Thuật ngữ: không gian đầu: n. bộ nhớ uninitialized :) –

+0

giữ c + + thuật ngữ cụ thể, một mảng là một đối tượng quá, và các ctors của tất cả các đối tượng phụ của nó sẽ được gọi. –

5

Sử dụng phương tiện mới mà người xây dựng sẽ được gọi trên bộ nhớ mới được cấp phát. Nếu điều đang được cấp phát không có các hàm tạo, thì hàm mới có chức năng giống với malloc. và thường nên được sử dụng để suy nghĩ về nó.

mới có thể hoặc có thể không được triển khai dưới dạng malloc - tiêu chuẩn C++ không yêu cầu phương pháp tiếp cận.

8
  • giao đất mới và các cuộc gọi đến ctor (thứ tự là không xác định), xóa các dtor và giải phóng bộ nhớ được phân bổ bởi một cuộc gọi đến mới
  • malloc chỉ phân bổ một số bộ nhớ, miễn phí xóa bộ nhớ được phân bổ bởi malloc
  • mới có thể được thực hiện bằng malloc (không cần thiết mặc dù theo tiêu chuẩn)
  • calloc làm điều tương tự như malloc và cũng zeroizes bộ nhớ vừa được cấp phát

như bài viết khác đã chỉ ra: mal loc/miễn phí là một phần của C++ để tương thích với C.

Xem thêm: Stroustrup: new vs malloc

1

sự khác biệt chính giữa mới và malloc tôi có thể nhớ là bạn không thể tái phân bổ bộ nhớ được phân bổ bởi mới sử dụng realloc. Vì vậy, nếu bạn muốn tăng/giảm kích thước của khối bộ nhớ, bạn phải phân bổ một khối mới và sao chép mọi thứ.

Calloc cho phép bạn khởi tạo khối bộ nhớ mà bạn phân bổ trong khi malloc thì không.

+0

Thực tế, điều này cũng giống với 'malloc'.Hàm 'realloc' thực hiện hầu hết thời gian. –

1

Khi bạn mới một đối tượng, không gian cho đối tượng không chỉ được cấp phát mà còn gọi hàm tạo của đối tượng. Nhưng đây là cách C++ được thực hiện, malloc là cách phiên bản cũ trong C cấp phát bộ nhớ.calloc giống với malloc, trừ khi nó xóa bộ nhớ cho tất cả các bit bằng không.

16

mới/xóa + mới []/xóa []:

  • new/delete là ++ cách C để cấp phát bộ nhớ và thu hồi bộ nhớ từ đống.
  • [] mới và xóa [] là cách C++ để phân bổ mảng của bộ nhớ tiếp giáp.
  • Nên được sử dụng bởi vì nó là loại an toàn hơn malloc
  • Nên được sử dụng bởi vì nó gọi constructor/destructor
  • Không thể được sử dụng theo cách realloc, nhưng có thể sử dụng vị trí mới để tái sử dụng cùng một bộ đệm dữ liệu
  • dữ liệu không thể được phân bổ với mới và trả tự do với miễn phí, cũng không xóa []

malloc/free + gia đình:

  • malloc/miễn phí/gia đình là cách C để phân bổ và bộ nhớ miễn phí từ heap.
  • calloc là giống như malloc mà còn khởi bộ nhớ
  • nên được sử dụng nếu bạn có thể cần phải tái phân bổ bộ nhớ
  • Dữ liệu không thể được phân bổ với malloc và giải phóng với xóa cũng không xóa []

Đồng thời xem số điện thoại related answer here

+0

Tôi nhận ra định dạng đó :-) –

+0

@Martin York: Tôi thấy bây giờ từ câu hỏi trùng lặp được liên kết. Tôi thích danh sách của bạn tốt hơn mặc dù :) Tôi nghĩ rằng đó là định dạng cược cho các loại câu hỏi mà bạn so sánh và tương phản 2 điều. Ít nhất tôi luôn nhận được số phiếu bầu cao cho loại câu trả lời được định dạng đó. –

5

Bạn không cần bất kỳ điều gì khác ngoài mới. Nó là một sự thay thế hoàn toàn cho malloc trong C++.

Đối với sự khác biệt: Malloc chỉ cấp phát bộ nhớ. Bộ nhớ được cấp phát mới và gọi các hàm tạo. Tương tự như vậy miễn phí chỉ phát hành bộ nhớ. Xóa phát hành bộ nhớ và gọi destructor.

Cảnh báo: Không trộn lẫn hai thành ngữ. Kết quả không xác định.

+0

Nhấp vào liên kết này http://www.ritambhara.in/difference-between-malloc-calloc-free-and-realloc-functions/ – Jaichander