我有一个内存分配问题,其中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个分配?这是正确的编码还是我可以提高效率?
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.)