Để ngăn chặn trường hợp cụ thể đó, bạn có thể chọn lấy một con trỏ (vì Weep(&std::vector<int>{1,2,3})không được phép) hoặc bạn có thể lấy tham chiếu không phải là lỗi cũng sẽ tạm thời bị lỗi.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Những điều này vẫn không đảm bảo giá trị vẫn còn hiệu lực, nhưng ít nhất là dừng sai lầm dễ dàng nhất, không tạo ra một bản sao và không cần phải numsđược tạo theo một cách đặc biệt (ví dụ như std::shared_ptrhoặc std::weak_ptrkhông).
std::scoped_locktham chiếu đến mutex sẽ là một ví dụ và một trong đó ptr duy nhất / chia sẻ / yếu không thực sự muốn. Thường std::mutexsẽ chỉ là một thành viên cơ bản hoặc biến cục bộ. Bạn vẫn phải rất cẩn thận, nhưng trong những trường hợp này thường dễ xác định tuổi thọ.
std::weak_ptrlà một tùy chọn khác cho việc không sở hữu, nhưng sau đó bạn buộc người gọi sử dụng shared_ptr(và do đó cũng phân bổ heap), và đôi khi điều đó không muốn.
Nếu một bản sao là OK, điều đó chỉ tránh được vấn đề.
Nếu Woopnên có quyền sở hữu hoặc vượt qua dưới dạng giá trị r và di chuyển (và tránh hoàn toàn các vấn đề về con trỏ / tham chiếu) hoặc sử dụng unique_ptrnếu bạn không thể tự di chuyển giá trị hoặc muốn con trỏ vẫn hợp lệ.
// the caller can't continue to use nums, they could however get `numbers` from Woop or such like
// or just let Woop only manipulate numbers directly.
Woop(std::vector<int> &&nums)
: numbers(std::move(nums)) {}
std::vector<int> numbers;
// while the caller looses the unique_ptr, they might still use a raw pointer, but be careful.
// Or again access numbers only via Woop as with the move construct above.
Woop(std::unique_ptr<std::vector<int>> &&nums)
: numbers(std::move(nums)) {}
std::unique_ptr<std::vector<int>> numbers;
Hoặc nếu quyền sở hữu được chia sẻ, bạn có thể sử dụng shared_ptrcho tất cả mọi thứ và nó sẽ bị xóa cùng với tham chiếu cuối cùng, nhưng điều này có thể khiến việc theo dõi vòng đời của đối tượng trở nên rất khó hiểu nếu sử dụng quá mức.
std::unique_ptrvì quyền sở hữu độc quyền, hoặcstd::shared_ptrquyền sở hữu chung, hoặcstd::weak_ptr, ít nhất, nhận ra dữ liệu bị mất).