A std::nothrow_t
chức năng deallocation tồn tại, nhưng bạn không thể gọi nó với biểu thức delete
.
Chức năng deallocation có sẵn để hoàn thành. Nếu biểu thức new
không thành công do ngoại lệ, trình biên dịch cần giải phóng bộ nhớ được phân bổ qua operator new
với một số khớp với gọi tới operator delete
. Vì vậy, cần phải có một số operator delete
chấp nhận std::nothrow_t
, để cho phép điều này.
(Nghĩa là, nói chung, một biểu new
với hình thức new (args...) T
sẽ phân bổ bộ nhớ với một cuộc gọi đến operator new(sizeof(T), args...)
. Để "trận đấu" có nghĩa là để gọi operator delete
với những lập luận tương tự, ngoại trừ người đầu tiên.)
Note bạn có thể gọi trực tiếp cho nhà điều hành: operator delete(memory, std::nothrow);
. Tuy nhiên, một biểu thức delete
không bao giờ gọi hàm deallocation chung với các tham số bổ sung.
Vì vậy, bạn có thể "gọi" nó với:
struct always_throw
{
always_throw() { throw std::exception(); }
};
new (std::nothrow) always_throw;
Tại một số điểm, điều này sẽ cấp phát bộ nhớ với một cuộc gọi đến:
void* __memory = operator new(sizeof(always_throw), std::nothrow);
Kể từ khi khởi tạo của đối tượng ném , trình biên dịch cần giải phóng bộ nhớ được cấp phát bằng chức năng deallocation phù hợp, do đó, nó có:
operator delete(__memory, std::nothrow);
Gọi phiên bản std::nothrow_t
.
Liên kết MSDN của bạn nói về sự tồn tại của 'nothrow', nhưng * that * không bao giờ nghi ngờ gì. Đó là * 'delete' * mà mọi người nói rằng bạn không có phiên bản 'nothrow', và họ nói đúng. –
Nếu cuốn sách đó là cuốn sách Schildt, bạn nên (không may) ném nó đi. Anh chàng đó thật khủng khiếp, và không biết anh ấy đang nói gì khi nói đến ngôn ngữ. – GManNickG