Um diesen speziellen Fall zu verhindern, können Sie entweder einen Zeiger verwenden (da dies Weep(&std::vector<int>{1,2,3})nicht zulässig ist) oder eine nicht konstante Referenz verwenden, die auch bei einem temporären Fehler auftritt.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Diese garantieren immer noch nicht, dass der Wert gültig bleibt, stoppen jedoch zumindest den einfachsten Fehler, erstellen keine Kopie und müssen nicht numsauf spezielle Weise erstellt werden (z. B. wie std::shared_ptroder std::weak_ptr).
std::scoped_lockEin Verweis auf den Mutex wäre ein Beispiel, und eines, bei dem ein eindeutiger / geteilter / schwacher ptr nicht wirklich erwünscht ist. Oft ist das std::mutexnur ein Basismitglied oder eine lokale Variable. Sie müssen immer noch sehr vorsichtig sein, aber in diesen Fällen ist es im Allgemeinen einfach, die Lebensdauer zu bestimmen.
std::weak_ptrist eine weitere Option für Nicht-Besitzer, aber dann zwingen Sie den Anrufer zur Verwendung shared_ptr(und damit auch zur Heap-Zuweisung), und manchmal ist das nicht erwünscht.
Wenn eine Kopie in Ordnung ist, wird das Problem nur vermieden.
If Woopsollte den Besitz übernehmen, entweder als r-Wert übergeben und verschieben (und Zeiger- / Referenzprobleme vollständig vermeiden) oder verwenden, unique_ptrwenn Sie den Wert selbst nicht verschieben können oder möchten, dass der Zeiger gültig bleibt.
// 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;
Wenn das Eigentum geteilt wird, können Sie es shared_ptrfür alles verwenden und es wird zusammen mit der endgültigen Referenz gelöscht. Dies kann jedoch dazu führen, dass das Verfolgen von Objektlebenszyklen bei Überbeanspruchung sehr verwirrend wird.
std::unique_ptrfür exklusives Eigentumstd::shared_ptroder für gemeinsames Eigentum oderstd::weak_ptrzumindest, um verlorene Daten zu erkennen).