Nếu tôi xác định operator delete như sau và nếu một ném constructor đối tượng trong biểu thức mới tôi mong đợi để xem kết quả của các cuộc gọi đến các nhà điều hành được xác định xóa:Tại sao chức năng deallocation không được gọi khi constructor đối tượng ném vào một biểu thức mới?
#include <new>
#include <cstdlib>
#include <iostream>
void*
operator new(std::size_t s){
std::cout << "alloc " << std::endl;
return std::malloc(s);
}
void
operator delete(void* p) noexcept {
std::cout << "dealloc " << std::endl;
std::free(p);
}
void
operator delete(void* p,std::size_t) noexcept{
std::free(p);
std::cout << "dealloc s" << std::endl;
}
struct A{
A(int i){
if(i>0)
throw 10;
}
};
int main(int argc// will equal 10
,char* arg[])
{
for(int i=0;i<argc;++i)
auto p=new A{argc};
return 0;
}
này chương trình chỉ ra alloc
, tại sao các nhà điều hành xóa không được gọi? Trong các tiêu chuẩn [expr.new] nó được xác định rằng:
Nếu bất kỳ phần nào của việc khởi tạo đối tượng mô tả ở trên chấm dứt bằng cách ném một ngoại lệ và một hàm deallocation phù hợp có thể được tìm thấy, chức năng deallocation được gọi đến miễn phí bộ nhớ trong đó đối tượng đang được xây dựng, sau đó ngoại lệ tiếp tục lan truyền trong ngữ cảnh của biểu thức mới.
Bạn không có thử khối catch. – Jarod42
@ Jarod42 Bạn nói đúng! Cảm ơn bạn! Tôi cần bắt khối vì sống chức năng chính với một ngoại lệ là UB hoặc là nó cho một số lý do khác trước? – Oliv
Nó dành cho phần UB. BTW, 'return i;' không hợp lệ ('i' nằm ngoài phạm vi). – Jarod42