Khi xem mã di sản tôi tìm thấy một cái gì đó tương tự như đoạn mã sauđiều hành quá tải mới và ngoại lệ đúng đắn
void* legacy_type::operator new(size_t size) {
return pool_alloc(size);
}
pool_alloc được biết là không bao giờ ném và trở về 0 trong trường hợp thất bại.
Không có quá tải cho std :: nothrow biến thể mới ở đây.
Tôi tự hỏi liệu mã này có đúng ngữ nghĩa và có hành vi được xác định rõ ràng hay không.
Nên new (std::nothrow) legacy_type;
sử dụng pool_alloc tùy chỉnh? Trong trình biên dịch của tôi nó không biên dịch chút nào. Liệu hành vi được xác định rõ ràng?
Nhà xây dựng có nên chạy và hỏng do this==0
nếu quá tải operator new
trả về 0 không? Trong trình biên dịch của tôi nó chạy (và treo trên khởi tạo thành viên). Đó là hành vi tiêu chuẩn được xác định rõ?
Hàm tạo không được gọi nếu toán tử 'new' trả về một con trỏ rỗng, và sau đó toàn bộ biểu thức' mới' sẽ trả về một con trỏ rỗng. – Simple
Hành vi chấp nhận được trong C++, nhưng sẽ bị lỗi nếu lớp có bảng ảo hoặc một hàm tạo không kiểm tra 'this == 0' trước khi truy cập các thành viên biến. Nó rõ ràng là không bình thường và có lẽ nên tránh. Bạn có thể cố gắng chỉ xóa định nghĩa đó và xem điều gì sẽ xảy ra ... –