Это отличный ответ об умных указателях, таких как уникальные указатели: Что такое умный указатель и когда мне следует его использовать? .
Вот пример, который они предоставляют в качестве простейшее использование уникального указателя:
void f()
{
{
std::unique_ptr<MyObject> ptr(new MyObject(my_constructor_param));
ptr->DoSomethingUseful();
} // ptr goes out of scope --
// the MyObject is automatically destroyed.
// ptr->Oops(); // Compile error: "ptr" not defined
// since it is no longer in scope.
}
Однако возникает вопрос: в таких случаях, как этот, цель состоит в том, чтобы просто удалить объект (освободить память), на который указывает уникальный указатель, когда он выходит из области видимости, почему бы просто не поместить весь объект в стек вместо этого, как этот ??
void f()
{
{
MyObject myobj(my_constructor_param);
myobj.DoSomethingUseful();
} // myobj goes out of scope --
// and is automatically destroyed.
// myobj.Oops(); // Compile error: "myobj" not defined
// since it is no longer in scope.
}
Мне кажется, что only logi c может быть, что некоторые объекты настолько вонючие, что могут переполнять стек, так как стеки, кажется, ограничены несколькими десятками КБ до нескольких МБ ( C / C ++ максимальный размер стека программы ), тогда как куча может составлять сотни ГБ!
Что за логика c? Дайте мне некоторое представление об этом, казалось бы, ненужном варианте использования уникального указателя. Чего мне не хватает?
Связанный:
- "Еще одна особенность стека, которую следует иметь в виду, заключается в том, что существует ограничение (зависит от ОС) на размер переменных, которые может храниться в стеке. Это не относится к переменным, расположенным в куче. " (https://gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html)