2012-04-02 31 views

Trả lời

8

Họ không giống nhau. new gọi hàm tạo, malloc chỉ cấp phát bộ nhớ.

Ngoài ra, nó hành vi undefined trộn hai (ví dụ: sử dụng new với freemalloc với delete).

Trong C++, bạn phải sử dụng newdelete, mallocfree đang có vì lý do tương thích với C.

+0

Okk. nhưng cả hai đều được sử dụng để quản lý bộ nhớ. vì vậy khi sử dụng mới và khi nào sử dụng malloc? – Parag

+4

@Parag Không "Trong C++, bạn phải sử dụng mới và xóa" câu trả lời đó? Không sử dụng malloc/miễn phí. – hvd

+0

@hvd: Đó không phải là lời khuyên chính xác. Lý do của bạn chỉ sử dụng 'mới' và' xóa' trong C++ không hoàn toàn chính xác (Đặc biệt là sau khi trả lời của Nicol cho bình luận của bạn.) –

5

Trong C++, nó hiếm khi hữu ích mà người ta sẽ sử dụng malloc & free thay vì new & delete.

Một kịch bản tôi có thể nghĩ đến là:

Nếu bạn không muốn để có được trí nhớ của bạn khởi tạo bởi các cuộc gọi constructor ngầm, và chỉ cần một cấp phát bộ nhớ đảm bảo cho placement new sau đó nó là hoàn toàn tốt đẹp để sử dụng mallocfree thay vì newdelete.

Mặt khác, điều quan trọng là phải biết rằng mallocnew không giống nhau!
Hai khác biệt quan trọng thẳng lên là:

  • new đảm bảo callng nhà xây dựng của lớp học của bạn để khởi tạo các thành viên lớp trong khi malloc không, One sẽ phải làm thêm memset hoặc liên quan đến các cuộc gọi chức năng gửi một malloc để khởi tạo bộ nhớ được cấp phát để làm điều gì đó có ý nghĩa.

  • Một lợi thế lớn là cho new bạn không cần phải kiểm tra cho NULL sau mỗi lần phân bổ, chỉ cần kèm theo xử lý ngoại lệ sẽ làm công việc giúp bạn tiết kiệm lỗi không cần thiết kiểm tra không giống như malloc.

+0

Chắc chắn, nhưng một lệnh gọi rõ ràng đến 'toán tử new' đủ cho điều đó, hoặc' new char [n] '. (Không có gì sai với việc sử dụng malloc cho điều đó, nhưng nó không cần thiết.) – hvd

+2

@hvd: 'new char []' có một số (rất nhỏ) trên không. Cụ thể, nó lưu trữ số ký tự được cấp phát trong khối bộ nhớ. –

+0

@NicolBolas: Và làm cách nào để 'tự do' biết số tiền miễn phí? 'malloc' sẽ lưu trữ số byte được phân bổ. – MSalters

3

Đầu tiên, khi bạn nói về newdelete, tôi giả sử bạn có nghĩa là biểu thức, và không phải là operator newoperator delete chức năng. Biểu thức newdelete không liên quan đến mallocfree và chỉ quản lý bộ nhớ một cách bất ngờ; Vai trò chính của họ là để quản lý đối tượng suốt đời: một biểu thức new sẽ gọi hàm operator new để có được bộ nhớ, và sau đó gọi các nhà xây dựng; một biểu thức delete sẽ gọi destructor trước khi gọi operator delete để miễn phí bộ nhớ.Đối với hầu hết các phần, các đối tượng phải là được tạo và không chỉ đơn giản là được phân bổ, có nghĩa là chỉ sử dụng các biểu thức.

Có một số trường hợp hiếm hoi trong đó một trường hợp muốn phân bổ riêng và khởi tạo (tạo); việc triển khai các ví dụ như std::vector là một ví dụ cổ điển , nơi bạn sẽ phân bổ cho nhiều đối tượng trong một lần, nhưng chỉ chỉ tạo từng cái một. Trong những trường hợp như vậy, bạn sẽ sử dụng hàm operator new để phân bổ và vị trí mới để khởi tạo; tại đầu kia, bạn sẽ gọi một cách rõ ràng hàm khởi tạo (chẳng hạn như p->~T()) để hủy và sử dụng chức năng operator delete để giải phóng bộ nhớ.

Tắt tay, tôi chỉ có thể nghĩ đến hai trường hợp bạn muốn sử dụng mallocfree bằng C++. Đầu tiên là triển khai các thay thế của riêng bạn của các hàm ::operator new::operator delete. (Tôi thường thay thế toàn cầu ::operator new::operator delete bằng cách gỡ lỗi phiên bản này, theo dõi phân bổ, đặt vùng bảo vệ xung quanh bộ nhớ được phân bổ, v.v.) là khi tương tác với thư viện cũ được viết bằng C: vượt qua một con trỏ tới bộ nhớ phân bổ bởi malloc (bởi vì nó sẽ giải phóng nó tự sử dụng free), hoặc nhiều thường, trả về một con trỏ tới bộ nhớ được phân bổ bởi malloc, mà bạn đang mong đợi để giải phóng, sau đó bạn phải sử dụng mallocfree . (Các thư viện tốt hơn sẽ cung cấp phân bổ và deallocation riêng chức năng của họ, mà làm nhiều hơn hoặc ít hơn những gì newdelete khai thác làm, nhưng sẽ luôn có những thứ như strdup().)

+0

Đối với những người quan tâm đến việc sử dụng đầu tiên được nêu trong câu trả lời, [Làm thế nào tôi nên viết tiêu chuẩn ISO C++ tùy chỉnh mới và xóa nhà khai thác?] (Http://stackoverflow.com/ câu hỏi/7194127/làm thế nào-nên-i-viết-iso-c-standard-conformant-custom-new-và-xóa-nhà khai thác) là một đọc tốt. –

+0

@Als Đối với sự phù hợp 100%, bạn có thể sử dụng ngôn ngữ, 'malloc' và' free' và không có gì khác. Thực tế, có rất nhiều hàm chỉ đơn giản là sẽ không bao giờ cấp phát bộ nhớ (như 'memset'); Tôi cũng xem xét chúng an toàn. Thực tế, bạn có thể an toàn với toàn bộ thư viện C, nhưng việc triển khai gỡ lỗi của tôi kiểm tra đệ quy và không sử dụng nhiều hơn 'malloc',' memset' và 'memcpy' nếu' :: operator new' đang được gọi đệ quy (vì vậy nếu 'fprintf' không sử dụng' :: toán tử new', tôi sẽ không kết thúc với đệ quy vô hạn). –

Các vấn đề liên quan