cuốn sách gpt4 ai đã làm

Hoán đổi Unique_ptr (tiện ích mở rộng Microsoft C++ không chuẩn)

In lại Tác giả: Walker 123 Thời gian cập nhật: 28-11-2023 00:11:55 27 4
mua khóa gpt4 Nike

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âu trả lời hay nhất

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::swapChuyể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);
}

Về c++ - hoán đổi Unique_ptr (tiện ích mở rộng Microsoft C++ không chuẩn), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/32558493/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress