我感到印象是当std :: shared_ptr超出范围时,它不会释放内存。下面是我的测试代码。你能告诉我我做错了吗? 我用gtest进行测试。当我执行此测试时,我可以看到内存不断消耗。我使用Microsoft VC ++ 2013。
void ProceedVector() {
std::vector<double> * numbers = new std::vector<double>();
for (int ind = 0; ind != 10000; ind++) {
numbers->push_back(ind);
}
std::shared_ptr<std::vector<double>> numbersPtr = std::make_shared<std::vector<double>>(*numbers);
}
TEST_F(ManagerTypeConvertorTest, ProceedVector) {
for (int ind = 0; ind != 50000; ind++) {
ProceedVector();
}
}
答案 0 :(得分:2)
每次调用ProceedVector
都会对std::vector<double>
个对象进行两次动态分配。一个在这里:
std::vector<double> * numbers = new std::vector<double>();
另一个在这里:
std::shared_ptr<std::vector<double>> numbersPtr = std::make_shared<std::vector<double>>(*numbers);
make_shared
并不意味着“将此对象分配给shared_ptr
。”这意味着“从这些参数中分配新对象,并使用shared_ptr
管理新分配的对象。”
根据您希望代码实现的内容,将new
行替换为make_shared
,并且根本不使用原始指针,或者替换make_shared
行有了这个:
std::shared_ptr<std::vector<double>> numbersPtr{numbers};
这将构造一个shared_ptr
,它将管理numbers
指向的内存。
答案 1 :(得分:0)
你有两个指向两个不同的向量的指针:
将被删除的一个(包含第一个向量中内容副本的共享指针)
将不删除(使用new
创建的第一个矢量)。