std :: shared_ptr <std :: vector <double>&gt;中的错误是什么?

时间:2017-05-22 12:33:16

标签: c++ pointers shared

我感到印象是当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();
    }
}

2 个答案:

答案 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创建的第一个矢量)。