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