Нет, вы не должны использовать new
. Во-первых, случаи, когда требуются прямые new
s, редки.
Вам не нужно создавать объекты с динамическим c сроком хранения («в куче») вручную. Контейнеры стандартной библиотеки хранят объекты непосредственно , а не ссылки или указатели на объекты. Они будут выделять для этих объектов и строить их самостоятельно. Вы предоставляете аргументы конструктора только функциям-членам контейнера, из которых контейнер (копирование / перемещение) создает хранимые элементы.
Вы можете просто объявить объект как автоматическую c переменную (то есть "в стеке") ):
vectorBuffer receiveVector(maxReplyLen);
i2cVectorMap.insert(I2cVectorEntry(address, receiveVector));
или использовать временный для промежуточного экземпляра вектора вместо именованной переменной (это также будет использовать перемещение вместо операции копирования и, следовательно, лучше для производительности):
i2cVectorMap.insert(I2cVectorEntry(address, vectorBuffer(maxReplyLen)));
и если вы используете emplace
вместо insert
, вы также можете удалить тип резервированной пары:
i2cVectorMap.emplace(address, vectorBuffer(maxReplyLen));
Вам не нужен указатель для вызова методов на объект на карте:
vectorBuffer& existingVector = i2cIter->second;
existingVector.resize(maxReplyLen);
existingVector.shrink_to_fit();
И для удаления элемента с карты вы используете .erase
функцию-члена:
i2cVectorMap.erase(deviceAddress);
Вам не нужно делать что-нибудь еще. Это также разрушит и освободит вектор.
Когда вам больше не нужна карта и векторы, которые в ней содержатся, вам также ничего не нужно делать. Деструктор карты очистит все автоматически, когда область, в которой определена карта, оставлена.