2014-07-01 16 views
7

Xem câu hỏi được liên kết.Tại sao thay thế malloc() yêu cầu kiến ​​thức về trình liên kết nhưng :: toán tử new() thì không?

Difference between global operator new and malloc

Các trạng thái chấp nhận câu trả lời,

"Thay malloc mở ra một thể của sâu. Nó có thể được thực hiện, nhưng không portably, bởi vì nó đòi hỏi sự hiểu biết về các mối liên kết."

Tại sao thay thế malloc đòi hỏi kiến ​​thức của các mối liên kết và tại sao thay thế :: operator new() không?

+0

Lý do mà bạn có thể chuyển tiếp tuyên bố nếu bạn chỉ có một con trỏ, nhưng cần một đầy đủ bao gồm nếu bạn có một thể hiện của một đối tượng. http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration?rq=1 – CoryKramer

+0

Câu lệnh từ câu trả lời được liên kết cho biết '3. mới có khái niệm về một new_handler, mà không có tương đương malloc.'. IMHO không đúng 100%. Thường có một số ký hiệu yếu được khai báo trong thư viện c không có sẵn, có thể được _overridden_ ​​với các triển khai của riêng bạn (xem ví dụ: ['_sbrk'] (http://en.wikipedia.org/wiki/Sbrk)). Các ký hiệu yếu được khai báo không nhất thiết liên quan đến _Knowdlege của trình liên kết_. –

Trả lời

7

Chuẩn C++ làm cho quy định cho trọng ::operator new. Trong khi việc thực hiện chắc chắn là lộn xộn và liên quan đến liên kết, một chương trình C++ chỉ có thể xác định một khác nhau ::operator new và nó hoạt động. Tiêu chuẩn C++ cho biết rõ ràng: Các chương trình có thể thay thế chúng bằng các định nghĩa của riêng chúng (v.v. các giới hạn và chi tiết khác nhau).

malloc mặt khác là một hàm bình thường được xác định trong thư viện thông thường và C (và C++, cho vấn đề đó) không có cơ sở để thay thế một hàm như thế. Bạn có thể thuyết phục hầu hết các mối liên kết dưới ánh mặt trời để liên kết đến libcbạn sans malloc và giải quyết các tài liệu tham khảo để malloc đến một số mã từ một tập tin thư viện/đối tượng. Nhưng bạn không thể chỉ xác định một khác nhau malloc chức năng vì đó là vi phạm nguyên tắc một nét: Bạn kết thúc với hai chức năng gọi là "malloc" trong chương trình, đó là cả hai bị cấm bởi tiêu chuẩn (đối với phi static, không ẩn danh - namespace, phi inline ... chức năng) và một vấn đề nghiêm trọng đối với linkers (rất có thể, một lỗi hoặc một trong hai định nghĩa được giảm).

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