Вектор надежно стирает свою память ⇐ C++
Вектор надежно стирает свою память
Мне нужно создать безопасный самоочищающийся буфер памяти, который не оставляет следов своего содержимого в памяти при очистке или выходе за пределы области действия.
В моем примере кода показано сравнение моего первого экспериментального вектора Vectorc и std::vector. В выводе вы можете видеть, что Vectorc перезаписывает свою память при вызове метода Clear(), в то время как содержимое std::vector все еще доступно после Clear().
Я боюсь, что в некоторых случаях компилятор может оптимизировать перезапись памяти, если доступ к памяти больше не осуществляется после очистки() или выхода за пределы области действия (деструктора). Допустимо ли использование летучих данных, как в строке, закомментированной в Clear()? Memset() не любит летучий void*, поэтому мне пришлось его снова отбросить. Должен быть лучший способ сделать это.
Я знаю, что растущий вектор и изменение размера могут оставить содержимое позади, поскольку блок памяти может быть перемещен в другое место, но давайте проигнорируем этот момент, чтобы пример был коротким.
Я получаю доступ к памяти после size() вплоть до емкости(). Это может привести к неопределенному поведению, или я так делаю?
Есть мысли по этой теме? Есть ли лучшие решения?
vectorc.cpp:
#include #include #include template class Vectorc: public std::vector { публика: ~векторк() { прозрачный(); } пустота очистить() { // изменчивый T* ptr = std::vector::data(); ??? T* ptr = std::vector::data(); memset((void*)ptr, 0, std::vector::capacity()); // Возможно, размер был уменьшен, поэтому размер может оставить память?! std::vector::clear(); } }; void printmem(const std::vector& v) { const char* ptr = v.data(); std::cout
Мне нужно создать безопасный самоочищающийся буфер памяти, который не оставляет следов своего содержимого в памяти при очистке или выходе за пределы области действия.
В моем примере кода показано сравнение моего первого экспериментального вектора Vectorc и std::vector. В выводе вы можете видеть, что Vectorc перезаписывает свою память при вызове метода Clear(), в то время как содержимое std::vector все еще доступно после Clear().
Я боюсь, что в некоторых случаях компилятор может оптимизировать перезапись памяти, если доступ к памяти больше не осуществляется после очистки() или выхода за пределы области действия (деструктора). Допустимо ли использование летучих данных, как в строке, закомментированной в Clear()? Memset() не любит летучий void*, поэтому мне пришлось его снова отбросить. Должен быть лучший способ сделать это.
Я знаю, что растущий вектор и изменение размера могут оставить содержимое позади, поскольку блок памяти может быть перемещен в другое место, но давайте проигнорируем этот момент, чтобы пример был коротким.
Я получаю доступ к памяти после size() вплоть до емкости(). Это может привести к неопределенному поведению, или я так делаю?
Есть мысли по этой теме? Есть ли лучшие решения?
vectorc.cpp:
#include #include #include template class Vectorc: public std::vector { публика: ~векторк() { прозрачный(); } пустота очистить() { // изменчивый T* ptr = std::vector::data(); ??? T* ptr = std::vector::data(); memset((void*)ptr, 0, std::vector::capacity()); // Возможно, размер был уменьшен, поэтому размер может оставить память?! std::vector::clear(); } }; void printmem(const std::vector& v) { const char* ptr = v.data(); std::cout
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему std::vector::clear() не стирает память, позволяя мне получить доступ к старым данным?
Anonymous » » в форуме C++ - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как передать вектор
и вектор > из Java в функцию С++ с помощью jna [закрыто]
Anonymous » » в форуме C++ - 0 Ответы
- 42 Просмотры
-
Последнее сообщение Anonymous
-