Я пишу программу, которая в конечном итоге потребует от меня создать вектор unique_ptrs для объектов пользовательского класса. У меня были некоторые утечки памяти, поэтому я решил удалить пользовательский класс из уравнения и просто попробовать его с помощью unique_ptr.vector unique_ptr не полностью удаляется (утечки памяти)
Когда я пытаюсь создать unique_ptr в стеке, утечек нет. Однако создание вектора unique_ptrs делает утечки. Для удовольствия я также попытался переместить unique_ptr в вектор, чтобы увидеть, что произошло. Мой код ниже (включает в себя проверку памяти МСВС):
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <vector>
#include <memory>
using namespace std;
int main()
{
vector<unique_ptr<int>> testvector;
unique_ptr<int> addMe;
testvector.emplace_back(move(addMe));
testvector.clear();
_CrtDumpMemoryLeaks();
return 0;
}
Когда я закомментируйте все, кроме создания «AddMe», я не получаю утечки.
Когда я прокомментирую все, кроме создания «testvector», я получаю утечку памяти из 8 байтов.
Когда я комментирую emplace_back из «addme» в «testvector», я получаю утечку памяти из 8 байтов.
Когда я ничего не прокомментирую, я получаю утечку памяти 12 байт.
Все ведет себя одинаково, когда я заменяю все «unique_ptr» на «shared_ptr».
Я делаю что-то неправильно или это можно ожидать с помощью векторов умных указателей?
Спасибо!
Попробуйте поместить весь свой код в фигурные скобки, поэтому он будет обладать таким образом, что деструктор вектора будет запущен до того, как вы проверите наличие утечек памяти.'clear()' уничтожит объекты, но вектор может сохранить память (которую вы можете проверить с помощью 'capacity()') для будущего использования. – Cornstalks
@Cornstalks Какой код нужно поместить в фигурные скобки? – PreacherJayne
Все перед '_CrtDumpMemoryLeaks();'. Таким образом, вы можете гарантировать, что 'testvector' полностью уничтожен * до * вы проверяете утечку памяти. – Cornstalks