Я думаю, что вы заявили, что это правда, но я немного запутался в цели.
vector<MyStorageClass*> &vm = s.getItems();
получает вектор по ссылке.Но вектор содержит указатели, поэтому вектор, выходящий из области видимости, не вызовет вообще никакого запуска деструкторов - деструкторы будут работать только в том случае, если это будут какие-то умные указатели (и даже в этом случае это зависит).
Таким образом, вы можете с радостью передавать вектор указателей по значению, не создавая при этом особых проблем.Я уверен, что вы сэкономите некоторую эффективность, сделав ее по ссылке, но я не думаю, что она настолько серьезна, как вы думаете.
Более того, ваши объекты, на которые указывают объекты, создаются с помощью новых), так что вы можете возвращать вектор по значению таким же образом, не опасаясь потери указанных объектов.
Итак, опять же, я думаю, что ваша логика в порядке, и ваш эталонный путь немного более эффективен,но я просто хотел убедиться, что вы знали, что он будет работать в обоих направлениях без проблем :) (и поскольку это вектор указателей, по значению тоже не так уж плохо).
PS: в терминахдля справки, вам действительно нужно беспокоиться о свисании, которое может быть более неприятным, чем вы думаете, как указывал Бьорн выше.Если вы когда-либо использовали string.c_str (), возможно, вы уже попробовали это.Если вы получаете .c_str () из строки и исходная строка выходит из области видимости, указатель, возвращаемый функцией .c_str (), висят (указывает на память, которая больше не используется для этой цели), и доступ к ней приводит к неопределенному поведению,Таким образом, значение by, вероятно, будет лучшим вариантом (но оно зависит от вашего дизайна - например, если это будет одноэлементное сохранение в течение всего времени вашего приложения, зависание, вероятно, не является проблемой).