C++ 使用共享ptr的内存双重分配
我有一个内存分配问题,C++ 使用共享ptr的内存双重分配,c++,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
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);
}
#包括
#包括
std::向量表;
标准:共享测试(int i){
列表。推回(标准::使共享(i));
返回list.back();
}
int main(){
标准::共享测试a=测试(5);
}
Valgrind输出:
==28524==堆摘要:
==28524==在出口处使用:0个块中有0个字节
==28524==总堆使用率:2个alloc,2个free,分配48个字节
==28524==
几乎所有std
容器都会发生这种情况。我只调用std::make_shared
一次
当我只运行一次
std::make_shared
时,为什么会得到2个alloc?如果可能的话,我怎么只能有一个alloc?这是正确的编码还是我可以让它更有效 valgrind告诉你的唯一一件事是有两次分配。它不会告诉您分配了什么类型的对象
值得测试一个基本情况:
#include <vector>
std::vector<int> list;
int test (int i) {
list.push_back(i);
return list.back();
}
int main() {
int a = test(5);
}
类似地,如果您只使用共享的_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);
}
因此,正如valgrind报告的那样,当您同时拥有一个共享的ptr和一个容器时,您自然会得到两个分配。(共享的容器的容器分配比int的容器大,因为共享的容器比int的容器大。)你有什么问题吗?1共享的容器分配+1向量中的分配没有内存泄漏,所以我不知道你可能有什么问题?@user263688否,您有两个对象维护分配的内存。至少,您将在堆上使用
make_shared
分配一个int
,并使用list::push_back
分配一个列表节点。
#include <memory>
std::shared_ptr<int> test (int i) {
return std::make_shared<int>(i);
}
int main() {
std::shared_ptr<int> a = test(5);
}
==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