C ++ правильная инициализация структуры - PullRequest
0 голосов
/ 16 сентября 2018

Извините, что задал еще один вопрос новичку, но Google не мог мне помочь (или, может быть, я просто не понял этого).

Я пытаюсь закодировать класс, способный хранить некоторые простые данные соединения. Моя ранняя концепция выглядит следующим образом:

struct connectionElement{
 string ip;
 SOCKET soc;
};

class ConnectionData{
 private:
  vector<connectionElement> connections;

 public:
  ConnectionData();
  ~ConnectionData();

  void addConnection(string ip, SOCKET soc);
};

void ConnectionData::addConnection(string ip, SOCKET soc) {
 connectionElement newElement;
 newElement.ip = ip;
 newElement.soc = soc;
 connections.push_back(newElement);
 return;
}

Теперь я прочитал, что объекты, инициализируемые без использования new , будут перемещены, как только код достигнет конца области видимости. Так как я являюсь java-парнем и не знаю ничего о распределении памяти, мне было интересно, как правильно инициализировать новый connectionElement в addConnection () .

Нужно ли использовать new , чтобы предотвратить удаление данных, или компилятор предполагает, что к хранимой структуре можно будет снова получить доступ позже? И если я использую оператор new , нужно ли мне удалять все объекты вручную до завершения потока, или это происходит автоматически?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Нужно ли использовать новое, чтобы предотвратить удаление данных, или компилятор предполагает, что к хранимой структуре можно будет снова получить доступ позже?

Нет, в вашемфрагмент, класс 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});

, что может сохранить конструкцию копии (если она еще не оптимизированакомпилятором).

0 голосов
/ 16 сентября 2018

Ваш код работает!

vector.push_back()

Копирует объект, поэтому в векторе соединений будет существовать копия всей структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...