При создании std::string внутри локальной области видимости какой-либо функции и добавлении в глобальный std::vector — строка сохраняется после выхода из функции. И при этом мы не делаем new. Как реализовать тоже самое для своего класса? Конечно же я хочу избавиться не сколько от new, сколько не заморачиваться с удалением, а, как я понимаю std::auto_ptr с контейнерами STL использовать нельзя. Да и вообще интересно как это реализовано в STL. Посмотреть сам могу, но ничего не могу понять
Здравствуйте, sanx, Вы писали:
S>При создании std::string внутри локальной области видимости какой-либо функции и добавлении в глобальный std::vector — строка сохраняется после выхода из функции.
Нет, она копируется. В вектор добавляется копия, оригинал при выходе из области видимости (в данном случае это границы функции) удаляется. Компиляторы могут делать оптимизацию в данном случае — не удалять оригинал и не делать копирования.
S>И при этом мы не делаем new. Как реализовать тоже самое для своего класса?
Сделать поддержку копирования.
S>Конечно же я хочу избавиться не сколько от new, сколько не заморачиваться с удалением, а, как я понимаю std::auto_ptr с контейнерами STL использовать нельзя.
Познакомься с boost, в частности с контейнерами владеющими объектами ptr_container (ptr_vector, ptr_set, ...) и умными указателями — shared_ptr и т.д.
S>Да и вообще интересно как это реализовано в STL. Посмотреть сам могу, но ничего не могу понять
Магии нет — передача по значению, а следовательно копирование.
Здравствуйте, sanx, Вы писали:
S>При создании std::string внутри локальной области видимости какой-либо функции и добавлении в глобальный std::vector — строка сохраняется после выхода из функции. И при этом мы не делаем new. Как реализовать тоже самое для своего класса? Конечно же я хочу избавиться не сколько от new, сколько не заморачиваться с удалением, а, как я понимаю std::auto_ptr с контейнерами STL использовать нельзя. Да и вообще интересно как это реализовано в STL. Посмотреть сам могу, но ничего не могу понять
Если проблема в излишних копированиях\удалениях временных объектов, то можно предложить два решения
1) Иметь "легковесный" конструктор по умолчанию и реализовать операцию swap()
2) Использовать компилятор, поддерживающий rvalue references (
http://thbecker.net/articles/rvalue_references/section_01.html), и реализовывать move-constructor и move-assignment.
В некоторых реализациях STL короткие строки использовали маленький внутренний буффер, а длинные — выделяли буффер в куче. Может поэтому в Вашем случае new не вызывается. Либо умный компилятор всё заинлайнил и соптимизировал...