Нужно ли использовать новое, чтобы предотвратить удаление данных, или компилятор предполагает, что к хранимой структуре можно будет снова получить доступ позже?
Нет, в вашемфрагмент, класс ConnectionData
владеет своим членом данных connections
, а элементы в векторе сохраняются по значению.Следовательно, connections
существует до тех пор, пока существует его собственный экземпляр класса:
void someFunctionInYourProgram()
{
ConnectionData example{};
example.addConection(/* ... */);
// do stuff with the ConnectionData instance and its connections
void doMoreStuffWith(example);
} // Now, example went out of scope, everything is automatically cleaned up.
И если я использую оператор new, нужно ли удалять все объекты вручную, прежде чем поток завершается или делаетчто происходит автоматически?
Если вы выделяете объекты с помощью new
и не передаете необработанный указатель, возвращенный какому-нибудь интеллектуальному объекту, заботящемуся об его удалении, вы действительно должны вручную очистить его с помощью delete
.Но не должно быть слишком много ситуаций, когда это применимо, поскольку std::shared_ptr
и std::unique_ptr
находятся там для спасения, и они поставляются с std::make_shared
и std::make_unique
, что даже делает устаревшим ручное обращение к new
operator.
Последнее примечание к этому фрагменту
connectionElement newElement;
newElement.ip = ip;
newElement.soc = soc;
connections.push_back(newElement);
Вы можете упростить это до
connections.push_back({ip, soc});
, что может сохранить конструкцию копии (если она еще не оптимизированакомпилятором).