2013-10-31 16 views
5

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õ?

+0

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

+0

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 ... –

Trả lời

1

1) Không được. Đây là những chức năng khác nhau. Và, khi bạn quá tải một trong các thao tác - tất cả các thao tác khác sẽ không bao giờ hoạt động, nếu chúng không bị quá tải, vì nếu có operator new trong phạm vi lớp và chữ ký là không thể chấp nhận được, thì trình biên dịch sẽ không tìm kiếm toàn cầu operator new. -Roror sẽ xảy ra.

2) Bạn phá vỡ postconditions, nếu new của bạn sẽ trả về con trỏ null. n3376 18.6.1.1/3

Hành vi bắt buộc: Trả về con trỏ không null để lưu trữ phù hợp phù hợp (3.7.4) hoặc loại bỏ ngoại lệ bad_- phân bổ ngoại lệ. Yêu cầu này là ràng buộc trên một phiên bản thay thế của chức năng này.

Nếu bạn muốn trả về 0, bạn nên sử dụng sau khi ký

void* operator new(size_t) throw() 

nếu bạn sử dụng quá tải này và trả về 0 từ nó, không có seg-lỗi.

n3376 5.3.4/13

Nếu chức năng phân bổ trả về null, khởi tạo sẽ không được thực hiện, chức năng deallocation sẽ không được gọi, và giá trị của các mới thể hiện được null.

+0

Tôi thấy, "không phải null" được tuyên bố rõ ràng trong tiêu chuẩn, cảm ơn. – Muxecoid

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