Tôi gặp sự cố khi biên dịch mã này:
void MyClass::MyMethod(Loại * new_ptr)
{
myInternalUniquePtr_->swap(std::unique_ptr(new_ptr));
}
ReSharper nóiLiên kết tham chiếu giá trị với tham chiếu giá trị là phần mở rộng Microsoft C++ không chuẩn
. Điều này có vẻ đúng vì tôi không thể biên dịch nó trong GCC chẳng hạn.
Tôi đã thay đổi mã thành:
void MyClass::MyMethod(Loại * new_ptr)
{
myInternalUniquePtr_->đặt lại(new_ptr);
}
Điều này có được chấp nhận không?
gia hạn: cài lại
Đang gọi deleter cho ptr cũ. Tiện ích mở rộng MS có gọi bộ xóa giá trị trước đó không?
Cập nhật2: Đã kiểm tra, vâng, nó đã xóa giá trị ptr cũ, nhưng không có trong tráo đổi
chính nó, nhưng sau khi chức năng tồn tại (cảm ơn James)
cài lại
đang gọi trình xóa của ptr cũ. Tiện ích mở rộng của MS có gọi trình xóa của giá trị trước đó không?
std::unique_ptr::swap
Chuyển quyền sở hữu con trỏ lưu trữ giữa các đối tượng liên quan đến cuộc gọi. Vì vậy,myInternalUniquePtr
Con trỏ sở hữu được trao đổi với đối tượng tạm thời,std::unique_ptr(new_ptr)
, thời gian tồn tại của nó kết thúc ở cuối biểu thức hoàn chỉnh mà nó thuộc về. Đối với các câu lệnh gọi hàm, điều này có nghĩa là trong ;
Nhấp để hủy tệp tạm thời này, có nghĩa là ban đầu nó được lưu trữ ởmyInternalUniquePtr_
Con trỏ in được giải phóng (bởi hàm hủy tạm thời) sau khi câu lệnh được thực thi. Việc VC++ cho phép một giá trị tạm thời bị ràng buộc bởi một tham chiếu giá trị không phải là hằng (một tính năng không tuân thủ) sẽ không ảnh hưởng đến hành vi trên.
thay thế:
myInternalUniquePtr_->đặt lại(new_ptr);
có hiệu quả. Tuy nhiên, người gọi không biết Phương thức của tôi
Điều gì đang diễn ra trong nội bộ Một lựa chọn tốt hơn là buộc người gọi phải vượt qua một cách rõ ràng. duy nhất_ptr
. , điều này cho thấy rõ ràng rằng hàm có quyền sở hữu con trỏ và nó không nên trỏ đến một mảng chẳng hạn.
void MyClass::MyMethod(std::unique_ptr new_ptr)
{
myInternalUniquePtr_ = std::move(new_ptr);
}
Tôi là một lập trình viên xuất sắc, rất giỏi!