Sự khác biệt giữa mới / xóa và malloc / miễn phí là gì?


Câu trả lời:


465

mới / xóa

  • Phân bổ / giải phóng bộ nhớ
    1. Bộ nhớ được phân bổ từ 'Cửa hàng miễn phí'
    2. Trả về một con trỏ được gõ đầy đủ.
    3. mới (phiên bản tiêu chuẩn) không bao giờ trả về NULL (sẽ thất bại)
    4. Được gọi với Type-ID (trình biên dịch tính kích thước)
    5. Có một phiên bản rõ ràng để xử lý mảng.
    6. Tái phân bổ (để có thêm không gian) không được xử lý bằng trực giác (vì trình tạo sao chép).
    7. Cho dù họ gọi malloc / miễn phí được thực hiện xác định.
    8. Có thể thêm bộ cấp phát bộ nhớ mới để xử lý bộ nhớ thấp (set_new_handler)
    9. toán tử mới / xóa có thể được ghi đè một cách hợp pháp
    10. hàm tạo / hàm hủy được sử dụng để khởi tạo / hủy đối tượng

malloc / miễn phí

  • Phân bổ / giải phóng bộ nhớ
    1. Bộ nhớ được phân bổ từ 'Heap'
    2. Trả về một khoảng trống *
    3. Trả về NULL khi thất bại
    4. Phải chỉ định kích thước yêu cầu theo byte.
    5. Phân bổ mảng yêu cầu tính toán không gian thủ công.
    6. Tái phân bổ khối bộ nhớ lớn hơn đơn giản (Không phải xây dựng bản sao để lo lắng)
    7. Họ sẽ KHÔNG gọi mới / xóa
    8. Không có cách nào để ghép mã người dùng vào chuỗi phân bổ để giúp bộ nhớ thấp.
    9. malloc / miễn phí KHÔNG thể bị ghi đè một cách hợp pháp

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.


12
Ai đó có thể chỉnh sửa để giải thích về "Cửa hàng miễn phí" trái ngược với đống không? Heap của quá trình là một khái niệm cấp độ hệ điều hành (?) Nổi tiếng về ngôn ngữ; "Cửa hàng miễn phí" đến từ đâu?
einpoklum

1
@einpoklum: Chúng chỉ là tên của các vùng nhớ. Không có bất cứ điều gì để làm với khái niệm ngôn ngữ được gọi là "heap" hoặc khái niệm os của "heap quy trình". C ++ được định nghĩa là trung tính Platform / OS / Compiler. Vì vậy, sử dụng một khái niệm hệ điều hành cụ thể như "đống quá trình" sẽ làm suy yếu tính linh hoạt của tiêu chuẩn.
Martin York

4
@winterlight: Điều đó đã từng đúng nhưng không còn nữa. Xem: linux.die.net/man/3/free If ptr is NULL, no operation is performed.
Martin York

2
@LokiAstari Trông giống như 'heap', 'cửa hàng miễn phí' và 'bộ nhớ / lưu trữ động' là từ đồng nghĩa: Trong A Tour of C ++ của Bjarne Stroustrup , anh nói "Nhà 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ớ độngheap ). 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."
Max Heiber

2
@mheiber: Có nghĩa là chúng có thể giống nhau. Và một số triển khai thực hiện mới bằng cách gọi malloc (lưu ý cách khác xung quanh rõ ràng là không được phép). Nhưng một số triển khai giữ cho các vùng nhớ hoàn toàn tách biệt. Lý do khiến chúng tách biệt nhau là vì điều này cho phép mã quản lý bộ nhớ C ++ được tối ưu hóa theo một cách khác so với quản lý bộ nhớ C. Vấn đề là: Chúng có thể giống nhau nhưng bạn không thể cho rằng chúng là như vậy.
Martin York

81

Sự khác biệt có liên quan nhất là newtoán tử cấp phát bộ nhớ sau đó gọi hàm tạo và deletegọi hàm hủy sau đó giải phóng bộ nhớ.


22
Nói đúng ra, toán tử mới chỉ cấp phát bộ nhớ. Đó là biểu thức mới gọi toán tử mới, sau đó chạy hàm tạo trong bộ nhớ được phân bổ.
Don Wakefield

Một sự khác biệt khác là nơi bộ nhớ được phân bổ. Gần đây tôi đã thấy ở đâu đó malloc / free hoạt động trên heap, trong khi new / xóa hoạt động trong một khu vực khác của bộ nhớ có tên tôi hiện tại. (Tuy nhiên, có thể nói rằng khu vực khác có thể được coi là một đống khác.)
RobH

2
@mgb: Có, bạn đúng rằng các đối tượng được phân bổ trên "Heap ứng dụng" hoặc ngăn xếp. Nhưng @RobH đang đề cập đến những gì tiêu chuẩn gọi các phần khác nhau của "Heap ứng dụng". Có "Heap" là nơi malloc phân bổ bộ nhớ từ và "Cửa hàng miễn phí" nơi phân bổ bộ nhớ mới. Mặc dù trong một số triển khai, các khu vực này có sự chồng chéo (đây là một chi tiết thực hiện).
Martin York

1
Tuyên bố của bạn là chính xác 100% nhưng chỉ không trả lời câu hỏi được hỏi, xem câu trả lời bên dưới, có một lý do tại sao nó nhiều phiếu hơn của bạn.
Murali

1
Tất cả những gì tôi đã cố gắng nói là nên có ít nhất một số đề cập đến malloc / miễn phí để nó đủ điều kiện để so sánh mà câu trả lời của bạn còn thiếu. Tuy nhiên, đó là một tuyên bố có liên quan và chính xác, vì vậy các upvote, tôi hy vọng bạn hiểu quan điểm của tôi. Dù sao, nếu chỉ có SO cho phép tôi lấy lại downvote của mình, tôi sẽ hết lòng.
Murali

30

newgọi ctor của đối tượng, deletegọi dtor.

malloc& freechỉ phân bổ và giải phóng bộ nhớ thô.


Bạn có ý nghĩa gì bởi bộ nhớ thô?
Kẻ hủy diệt

3
Bộ nhớ thô không có gì được thực hiện cho nó. Chưa có đối tượng nào được xây dựng trong đó, không có gì được sao chép vào đó và trong hầu hết các trường hợp, nội dung trước đó chưa được ghi đè.
James Curran

14

new/ deletelà C ++, malloc/ freexuất phát từ C.

Trong C ++, newgọi hàm tạo đối tượng và deletegọi hàm hủy.

mallocfree, đế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.


9
"Đến từ thời kỳ đen tối trước OO" nghe có vẻ như bạn đang ám chỉ rằng mới / xóa tốt hơn malloc / miễn phí trong thực tế, không tốt hơn hay xấu hơn, chúng chỉ có những cách sử dụng khác nhau. Lưu ý rằng tôi không phải là người hạ thấp bạn, tôi chỉ đoán thôi.
Graeme Perrow

13

Trong C ++ new/ deletegọi Con Contor / Destructor tương ứng.

malloc/ freechỉ đơn giản là phân bổ bộ nhớ từ heap. new/ deletephân bổ bộ nhớ là tốt.


10

Điểm giống nhau duy nhất là malloc/ newcả 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/ deletethự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/ freechỉ bao giờ phân bổ và bộ nhớ miễn phí.

Trong thực tế, newcó 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 newkhông.


7

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:

  • newlà loại an toàn, malloctrả về các đối tượng của loạivoid*

  • newném một ngoại lệ về lỗi, malloctrả về NULLvà đặt errno

  • newlà một toán tử và có thể bị quá tải, malloclà 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

  • mallocphân bổ được tạo ra có thể được thay đổi kích thước thông qua realloc, newphân bổ được tạo ra có thể được thay đổi kích thước

  • malloccó thể phân bổ một đoạn bộ nhớ N-byte, newphải được yêu cầu phân bổ một mảng, giả sử, charcá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.


5

Có một vài điều newkhông malloclàm được:

  1. new xây dựng đối tượng bằng cách gọi hàm tạo của đối tượng đó
  2. new không yêu cầu typecasting của bộ nhớ được phân bổ.
  3. Nó không yêu cầu một lượng bộ nhớ được phân bổ, thay vào đó nó đòi hỏi một số đối tượng được xây dựng.

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, newcó thể bị quá tải nhưng mallockhông thể.

Trong một từ, nếu bạn sử dụng C ++, hãy cố gắng sử dụng newcàng nhiều càng tốt.


4

cũng thế,

toàn cầu mới và xóa có thể được ghi đè, malloc / miễn phí không thể.

thêm mới và xóa có thể được ghi đè cho mỗi loại.


3

newdeletecá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 đó).

mallocfreelà 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ổ. mallocfreedù 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).


1
mới trong C ++ không khai báo một thể hiện của một lớp. Nó (thường) phân bổ một từ đống, và nó không khai báo bất cứ điều gì. Bạn có thể khai báo một thể hiện chỉ bằng cách khai báo nó, trong trường hợp đó nó sẽ nằm trên ngăn xếp hoặc trên toàn cầu, tùy thuộc vào thời gian lưu trữ của khai báo.
Steve Jessop

Chà, nó phân bổ không gian bộ nhớ cho lớp nhưng bạn không thể "khai báo" một lớp trong ngăn xếp, không phải theo nghĩa thực sự là lưu trữ lớp trong ngăn xếp. Khai báo chỉ liên quan đến con trỏ tới lớp luôn được phân bổ trong ngăn xếp mà bộ nhớ thực giữ lớp nằm trong heap.
Jorge Córdoba

Có bạn có thể. Theo các thẻ câu hỏi, đây là C ++, vì vậy các đối tượng có thể đi vào ngăn xếp. Và mới không phải là một tuyên bố, đó là một biểu thức. Tuyên bố một cái gì đó và phân bổ nó là những điều riêng biệt.
Steve Jessop

2

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õ.


2
  • mới là một toán tử, trong khi malloc () là một fucntion.
  • mới trả về kiểu dữ liệu chính xác, trong khi malloc () trả về void * (con trỏ của kiểu void).
  • malloc (), bộ nhớ không được khởi tạo và giá trị mặc định là rác, trong khi đó, trong trường hợp mới, bộ nhớ được khởi tạo với giá trị mặc định, như với 'zero (0)' trong trường hợp trên int.
  • xóa và free () cả hai đều có thể được sử dụng cho con trỏ 'NULL'.

0
  • Để sử dụng 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.
  • newdeletecó thể bị quá tải nhưngmalloc không thể.
  • Sử dụng vị trí 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.

1
alloc.hkhô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.
MM

0

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

-3

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.