việc sử dụng malloc
và free
là gì khi chúng ta có new
và delete
trong C++. Tôi đoán chức năng của cả hai số free
và delete
đều giống nhau.Tại sao sử dụng malloc/miễn phí, khi chúng tôi có mới/xóa?
Trả lời
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 free
và malloc
với delete
).
Trong C++, bạn phải sử dụng new
và delete
, malloc
và free
đang có vì lý do tương thích với C.
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
@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
@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.) –
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 malloc
và free
thay vì new
và delete
.
Mặt khác, điều quan trọng là phải biết rằng malloc
và new
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 khimalloc
không, One sẽ phải làm thêmmemset
hoặc liên quan đến các cuộc gọi chức năng gửi mộtmalloc
để 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 choNULL
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
.
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
@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ớ. –
@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
Đầu tiên, khi bạn nói về new
và delete
, tôi giả sử bạn có nghĩa là biểu thức, và không phải là operator new
và operator delete
chức năng. Biểu thức new
và delete
không liên quan đến malloc
và free
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 malloc
và free
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
và ::operator delete
. (Tôi thường thay thế toàn cầu ::operator new
và ::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 malloc
và free
. (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ì new
và delete
khai thác làm, nhưng sẽ luôn có những thứ như strdup()
.)
Đố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. –
@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). –
- 1. Tại sao chúng ta nên sử dụng mã hóa ui khi chúng ta có Specflow?
- 2. Tại sao nên sử dụng mã hóa CJSON khi chúng tôi có json_encode
- 3. Tại sao nên sử dụng id khi chúng ta có thể sử dụng NSObject?
- 4. Tại sao chúng ta sử dụng Response.ClearHeaders()?
- 5. Tại sao một số lớp .NET Framework không sử dụng Generics khi chúng có thể?
- 6. Tôi có nên sử dụng FxCop và tại sao không?
- 7. tại sao tôi nhận được System.OutOfMemoryException ngay cả khi có khoảng 700Mb RAM miễn phí?
- 8. khi nào hoặc tại sao tôi sử dụng Property.forName()?
- 9. Tại sao chúng ta sử dụng radian trong lập trình?
- 10. Tại sao DIAL (Khám phá và khởi chạy) khi chúng tôi có UPnP?
- 11. Tại sao sử dụng werkzeug khi có bình
- 12. Tại sao tôi nên sử dụng WndProc khi tôi có sự kiện biểu mẫu?
- 13. (Tại sao) tôi nên sử dụng obfuscation?
- 14. tại sao chúng ta không nên sử dụng ++ trong javascript?
- 15. Tại sao chính xác chúng ta sử dụng NoSQL?
- 16. Tại sao chúng ta cần sử dụng cơ số?
- 17. Tại sao chúng ta sử dụng động Proxy
- 18. Tại sao chúng ta sử dụng chú thích ngủ đông?
- 19. Tại sao chúng ta sử dụng giao diện thành viên?
- 20. Java đúc có giới thiệu chi phí không? Tại sao?
- 21. Tại sao tôi phải sử dụng $ (this)?
- 22. Tại sao chúng ta vẫn cần tệp .lib stub khi chúng tôi có triển khai .dll thực tế?
- 23. Tại sao luôn có isEmpty trong khi tôi sử dụng! IsEmpty 99% thời gian
- 24. Tại sao lại sử dụng khung mocking thay vì xoay vòng tay của chúng tôi?
- 25. Tại sao tôi cần sử dụng ngắt?
- 26. Tại sao tôi nên sử dụng Socket.io?
- 27. Tại sao tôi nên sử dụng glBindAttribLocation?
- 28. Tại sao chúng ta cần đăng ký stackpointer khi chúng tôi đã có đăng ký bộ đếm chương trình?
- 29. Khi nào và tại sao chúng ta nên sử dụng lớp System.ComponentModel.Container?
- 30. Tại sao chúng ta không sử dụng toán tử mới khi khởi tạo một chuỗi?
Nó chuyển sang từ C ... – Mysticial