使用shared_ptr进行内存双重分配

Lev*_*Lev 2 c++

我有一个内存分配问题,其中std::shared_ptr两次分配:

#include <memory>
#include <vector>

std::vector<std::shared_ptr<int>> list;

std::shared_ptr<int> test (int i) {
    list.push_back(std::make_shared<int>(i));
    return list.back();
}

int main() {
    std::shared_ptr<int> a  = test(5);
}
Run Code Online (Sandbox Code Playgroud)

Valgrind输出:

==28524== HEAP SUMMARY: ==28524== in use at exit: 0 bytes in 0 blocks ==28524== total heap usage: 2 allocs, 2 frees, 48 bytes allocated ==28524==

几乎所有std容器都会发生这种情况.我只打了std::make_shared一次电话.

当我只运行std::make_shared一次时,为什么会得到2个分配?如果可能,我如何只有1个分配?这是正确的编码还是我可以提高效率?

ric*_*ici 5

valgrind告诉你的唯一的事情是有两个分配.它不会告诉您分配了哪种对象.

值得测试基础案例:

#include <vector>

std::vector<int> list;

int test (int i) {
    list.push_back(i);
    return list.back();
}

int main() {
    int a  = test(5);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们将看到一个区域被分配:内容std::vector:

==10570== HEAP SUMMARY:
==10570==     in use at exit: 0 bytes in 0 blocks
==10570==   total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==10570== 
==10570== All heap blocks were freed -- no leaks are possible
Run Code Online (Sandbox Code Playgroud)

同样,如果您只使用shared_ptr,您最终也会得到一个分配:

#include <memory>

std::shared_ptr<int> test (int i) {
    return std::make_shared<int>(i);
}

int main() {
    std::shared_ptr<int> a  = test(5);
}
Run Code Online (Sandbox Code Playgroud)

 

==10601== HEAP SUMMARY:
==10601==     in use at exit: 0 bytes in 0 blocks
==10601==   total heap usage: 1 allocs, 1 frees, 32 bytes allocated
==10601== 
==10601== All heap blocks were freed -- no leaks are possible
Run Code Online (Sandbox Code Playgroud)

很自然地,当你同时拥有一个shared_ptr和一个容器时,你会得到两个分配,就像valgrind报告一样.(容器分配比shared_ptrs容器大,而不是int容器,因为shared_ptr大于int.)