Khi tôi tạo ra một unique_ptr
với deleter
, nó hoạt động:unique_ptr là không nhận được init với mặc định deleter
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr(new Animal<Cat>, [](Animal<Cat> *ls) {
delete ls;
});
Nhưng, mã này được ném lỗi:
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr;
ptr = std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)>(new Animal<Cat>, [](Animal<Cat> *ls) {
delete ls;
});
Lỗi:
/usr/bin/../lib/c++/v1/memory:2561:13: error: static_assert failed "unique_ptr constructed with null function pointer deleter"
static_assert(!is_pointer<deleter_type>::value,
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: in instantiation of member function 'std::__1::unique_ptr<Animal<Cat>, void (*)(Animal<Cat> *)>::unique_ptr' requested here
std::unique_ptr<Animal<Cat>, void(*)(Animal<Cat>*)> ptr;
^
Đây là phiên bản trình biên dịch của tôi:
Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
Lớp Động vật và mèo là tầm thường. This is the entire code.
Lý giải cho hành vi này 'unique_ptr' là cố gắng thông báo cho bạn tại thời gian biên dịch rằng một hàm con trỏ-to-null không phải là một deleter tốt. Bạn có thể ghi đè hành vi này bằng cách gửi một cách rõ ràng trong một dấu phân cách nullptr. Nhưng giải pháp bạn chọn thay thế là tốt hơn. –
@HowardHinnant Nó sẽ kiểm tra nullptr lúc chạy hay nó sẽ cố gọi hàm đó? – user877329
@ user877329: Nếu '~ unique_ptr()' hoặc 'reset()' được gọi và 'get_deleter() (get())' không được định dạng đúng, bạn sẽ nhận được hành vi không xác định. –