Sự khác biệt giữa new
/ delete
và malloc
/ là free
gì?
Liên quan (trùng lặp?): Trong trường hợp nào tôi sử dụng malloc vs new?
Sự khác biệt giữa new
/ delete
và malloc
/ là free
gì?
Liên quan (trùng lặp?): Trong trường hợp nào tôi sử dụng malloc vs new?
Câu trả lời:
Bảng so sánh các tính năng:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
Bộ nhớ kỹ thuật được cấp phát bởi mới đến từ 'Cửa hàng miễn phí' trong khi bộ nhớ được cấp phát bởi malloc đến từ 'Heap'. Cho dù hai lĩnh vực này giống nhau là một chi tiết thực hiện, đó là một lý do khác mà malloc và mới không thể trộn lẫn.
If ptr is NULL, no operation is performed.
new
điều hành phân bổ bộ nhớ từ cửa hàng miễn phí (còn gọi là bộ nhớ động và heap ). Tiêu chuẩn C ++ 14, mục 3.7.4 trên Lưu trữ động cho biết "Các đối tượng có thể được tạo động trong quá trình thực thi chương trình (1.9), sử dụng biểu thức mới (5.3.4) và bị hủy bằng biểu thức xóa."
Sự khác biệt có liên quan nhất là new
toán tử cấp phát bộ nhớ sau đó gọi hàm tạo và delete
gọi hàm hủy sau đó giải phóng bộ nhớ.
new
gọi ctor của đối tượng, delete
gọi dtor.
malloc
& free
chỉ phân bổ và giải phóng bộ nhớ thô.
new
/ delete
là C ++, malloc
/ free
xuất phát từ C.
Trong C ++, new
gọi hàm tạo đối tượng và delete
gọi hàm hủy.
malloc
và free
, đến từ thời kỳ đen tối trước OO, chỉ phân bổ và giải phóng bộ nhớ, mà không thực hiện bất kỳ mã nào của đối tượng.
Điểm giống nhau duy nhất là malloc
/ new
cả hai trả về một con trỏ giải quyết một số bộ nhớ trên heap và cả hai đều đảm bảo rằng một khi một khối bộ nhớ như vậy được trả về, nó sẽ không được trả lại trừ khi bạn giải phóng / xóa nó trước. Đó là, cả hai "phân bổ" bộ nhớ.
Tuy nhiên, new
/ delete
thực hiện các công việc khác tùy ý ngoài ra, thông qua các hàm tạo, hàm hủy và quá tải toán tử. malloc
/ free
chỉ bao giờ phân bổ và bộ nhớ miễn phí.
Trong thực tế, new
có thể tùy chỉnh đủ để nó không nhất thiết phải trả lại bộ nhớ từ heap, hoặc thậm chí phân bổ bộ nhớ. Tuy nhiên, mặc định new
không.
Sự khác biệt chính giữa new và malloc là new gọi hàm tạo của đối tượng và lệnh gọi tương ứng để xóa các lệnh gọi của hàm đối tượng.
Có những khác biệt khác:
new
là loại an toàn, malloc
trả về các đối tượng của loạivoid*
new
ném một ngoại lệ về lỗi, malloc
trả về NULL
và đặt errno
new
là một toán tử và có thể bị quá tải, malloc
là một hàm và không thể bị quá tải
new[]
, phân bổ mảng, trực quan và loại an toàn hơn so với malloc
malloc
phân bổ được tạo ra có thể được thay đổi kích thước thông qua realloc
, new
phân bổ được tạo ra có thể được thay đổi kích thước
malloc
có thể phân bổ một đoạn bộ nhớ N-byte, new
phải được yêu cầu phân bổ một mảng, giả sử, char
các loại
Nhìn vào sự khác biệt, một bản tóm tắt là malloc là C-esque, mới là C ++ - esque. Sử dụng một trong đó cảm thấy đúng cho cơ sở mã của bạn.
Mặc dù việc triển khai mới và malloc là hợp pháp khi sử dụng các thuật toán phân bổ bộ nhớ khác nhau, trên hầu hết các hệ thống mới được triển khai nội bộ bằng cách sử dụng malloc, không mang lại sự khác biệt ở cấp hệ thống.
Có một vài điều new
không malloc
làm được:
new
xây dựng đối tượng bằng cách gọi hàm tạo của đối tượng đónew
không yêu cầu typecasting của bộ nhớ được phân bổ.Vì vậy, nếu bạn sử dụng malloc
, thì bạn cần phải làm những điều trên một cách rõ ràng, điều này không phải lúc nào cũng thực tế. Ngoài ra, new
có thể bị quá tải nhưng malloc
không thể.
Trong một từ, nếu bạn sử dụng C ++, hãy cố gắng sử dụng new
càng nhiều càng tốt.
new
và delete
là các nguyên hàm C ++ khai báo một thể hiện mới của một lớp hoặc xóa nó (do đó gọi hàm hủy của lớp đó).
malloc
và free
là các hàm C và chúng phân bổ và các khối bộ nhớ trống (có kích thước).
Cả hai sử dụng đống để phân bổ. malloc
và free
dù sao cũng là "mức thấp" hơn vì chúng chỉ dành một phần không gian bộ nhớ có thể sẽ được liên kết với một con trỏ. Không có cấu trúc nào được tạo xung quanh bộ nhớ đó (trừ khi bạn coi mảng C là cấu trúc).
mới và xóa là các toán tử trong c ++; mà có thể bị quá tải quá. malloc và miễn phí là chức năng trong c;
malloc trả về null ptr khi thất bại trong khi ném ngoại lệ mới.
địa chỉ được trả về bởi malloc cần phải gõ lại khi nó trả về (void *) malloc (size) Mới trả về con trỏ đã gõ.
malloc()
, chúng tôi cần bao gồm <stdlib.h>
hoặc
<alloc.h>
trong chương trình không bắt buộc new
.new
và delete
có thể bị quá tải nhưngmalloc
không thể.new
, chúng tôi có thể chuyển địa chỉ nơi chúng tôi muốn phân bổ bộ nhớ nhưng điều này là không thể trong trường hợp malloc
.alloc.h
không phải là một tiêu đề tiêu chuẩn. <new>
được yêu cầu sử dụng vị trí mới.
Mã này để sử dụng từ khóa xóa hoặc chức năng miễn phí. Nhưng khi tạo một đối tượng con trỏ bằng cách sử dụng 'malloc' hoặc 'new' và giải phóng bộ nhớ đối tượng bằng cách xóa ngay cả con trỏ đối tượng đó có thể là hàm gọi trong lớp. Sau đó, sử dụng miễn phí thay vì xóa, nó cũng hoạt động sau câu lệnh miễn phí, nhưng khi sử dụng cả hai thì chỉ có đối tượng con trỏ không thể gọi hàm trong lớp .. mã như sau:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
đầu ra:
Hello Hi 0x2abfef37cc20
1. mới cú pháp đơn giản hơn malloc ()
2.new/delete là một toán tử trong đó malloc () / free () là một hàm.
3.new/delete thực thi nhanh hơn malloc () / free () vì mã lắp ráp mới được trình biên dịch dán trực tiếp.
4. chúng tôi có thể thay đổi ý nghĩa mới / xóa trong chương trình với sự trợ giúp của nhà điều hành.