Кога операторът delete няма да бъде извикан за обект в умни указатели?
sobes.tech AI
Отговор от AI
Операторът delete за обект, управляван от интелигентен указател, няма да бъде извикан в следните случаи:
-
За
std::shared_ptr: ако съществува поне още единshared_ptr, който притежава същия обект. Изтриването се случва само когато броячът на препратките достигне нула. -
За
std::weak_ptr: той не притежава обекта, а само към него се позовава, затоваdeleteне се извиква при унищожаването наweak_ptr. -
За
std::unique_ptr: ако указателят е прехвърлен или преместен, и текущиятunique_ptrвече не притежава обекта. -
Ако интелигентният указател е създаден с персонализиран делител, който не извиква
delete(например освобождава ресурса по друг начин).
Пример с std::shared_ptr:
#include <memory>
#include <iostream>
struct Foo {
~Foo() { std::cout << "Foo унищожен\n"; }
};
int main() {
std::shared_ptr<Foo> sp1(new Foo());
{
std::shared_ptr<Foo> sp2 = sp1; // брояч на препратки = 2
} // sp2 се унищожава, брояч = 1, delete не се извиква
// delete ще бъде извикан само когато и sp1 бъде унищожен
}
Тук delete ще бъде извикан само след унищожаването на последния shared_ptr.