Распределителя является аргументом шаблона, если вы решите реализовать один для вашего конкретного случая использования он будет действовать только в тех объектах, для которых явно выбираете в этот распределитель:
std::vector<T,SecureAllocator> v; // this uses the memset_s under the hood
std::vector<T> n; // this doesn't
Теперь, распределяющий изменяет тип объекта, а это означает, что если у вас есть функции, которые принимают std::vector<T>
в качестве аргументов, вы не сможете передать std::vector<T,SecureAllocator>
.
В качестве альтернативы вы можете реализовать полиморфный распределитель, в котором можно управлять источником памяти во время выполнения. Это поддерживается в BSL (реализации на C++ 03 стандартной библиотеки доступны в GitHub), в этом случае векторы того же типа, даже если они выделяют из разных источников:
bsl::vector<T> v(bslma::Default::allocator());
// bslma::Default::allocator() is new/delete
bsl::vector<T> n(secureAllocator());
Вероятно, интерес: HTTP : //stackoverflow.com/a/5735744/16287 –
Да, по причинам, которые лучше всего объясняются [здесь] (http://stackoverflow.com/questions/8190950/may-stdvector-make-use-of-small-buffer-optimization). – MSalters
Как насчет 'allocate_shared' или какого-либо варианта [' allocate_unique'] (http://stackoverflow.com/a/23132307/596781)? –