std::shared_ptr<std::vector有什么问题<double>>

what's wrong in std::shared_ptr<std::vector<double>>

本文关键字:std gt lt 问题 double shared 什么 vector ptr      更新时间:2023-10-16

我的印象是 std::shared_ptr 在超出范围时不会释放内存。下面是我的测试代码。你能告诉我我做错了什么吗?我使用 gtest 进行测试。当我执行此测试时,我可以看到内存不断消耗。我使用 VC++ 2013 Microsoft。

    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();
    }
}

每次调用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指向的内存。

有两个指向两个不同向量的指针:

  • 一个将被删除的指针(包含来自第一个向量的内容副本的共享指针(

  • 还有一个不会被删除的(你用new创建的第一个向量(。