Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指示std::list.push_back()使用堆分配的内存地址_C++_List_Stl - Fatal编程技术网

C++ 指示std::list.push_back()使用堆分配的内存地址

C++ 指示std::list.push_back()使用堆分配的内存地址,c++,list,stl,C++,List,Stl,据我所知,std::list以双链表格式在内部存储其元素,这意味着分配了堆内存。假设我已经有了一个使用new堆分配的变量,我可以指示std::list push_back()函数在其内部双链接列表中使用该内存,而不是新分配新内存,然后将数据复制到该新内存中。这是一个示例代码: #include <iostream> #include <list> struct St { int a; int b; }; int main() { std::li

据我所知,
std::list
以双链表格式在内部存储其元素,这意味着分配了堆内存。假设我已经有了一个使用
new
堆分配的变量,我可以指示
std::list push_back()
函数在其内部双链接列表中使用该内存,而不是新分配新内存,然后将数据复制到该新内存中。这是一个示例代码:

#include <iostream>
#include <list>

struct St {
    int a;
    int b;
};

int main()
{
    std::list<St> St_list;
    St *st = new St;
    st->a = 1;
    st->b = 2;

    St_list.push_back(*st); // can i instruct St_list to use the memory address of st
    
    std::cout << st << std::endl;
    std::cout << &St_list.back() << std::endl;
    
    return 0;
}
#包括
#包括
结构街{
INTA;
int b;
};
int main()
{
std::列表St_列表;
St*St=新St;
st->a=1;
st->b=2;
St_list.push_back(*St);//我可以指示St_list使用St的内存地址吗

std::cout最简单的答案是否定的,内存不能重复使用

稍微解释一下,
std::list
的内部节点类不保留指向值的“指针”,而是保留值本身。该节点的定义大致如下:

template <class T>
struct List_Node {
   T value; 
   List_Node* prev;
   List_Node* next;
}; 

模板
结构列表节点{
T值;
列表_节点*prev;
列出_节点*下一步;
}; 
因此,不可能“重用”分配的内存

但是-节点可以在具有的
std::list
对象之间传输,因此可以避免重新分配

std::list<St> st{{1,2}};

std::list<St> St_list;
St_list.splice(St_list.end(), st);
// now st is empty, St{1,2} is in St_list - no "reallocation" happened

std::list st{{{1,2};
std::列表St_列表;
St_list.splice(St_list.end(),St);
//现在st是空的,st{1,2}在st_列表中-没有发生“重新分配”

Nope,对不起,
std::list
不是这样工作的。除了列表中的每个对象之外,它还具有
std::list
内部使用的正向和反向内部指针。当然,它们从您
新建的
对象中丢失。您最好的选择可能是
重新放置一个默认构造的元素,然后直接写入该节点,而不是使用
st
。您必须使用自定义分配器,为列表提供所需的内存。这不是不可能的,只是深奥。那么为什么不
std::list
(或者更好的
std::list
)(您的代码会泄漏内存)?@KamilCuk如果这是可能的,那么我们可以避免内存泄漏我在
std::list
之后将变量设置为
nullptr
,获得该内存的所有权。你知道,就像移动分配一样