C++;:“这对”意味着什么;新";一个不断增长的收藏? 我是C++新手。“新”系列到底意味着什么?例如: UnicodeStringList* tmp = new UnicodeStringList; // where UnicodeStringList is typedef to std::list<UnicodeString> *tmp = another_string_list;

C++;:“这对”意味着什么;新";一个不断增长的收藏? 我是C++新手。“新”系列到底意味着什么?例如: UnicodeStringList* tmp = new UnicodeStringList; // where UnicodeStringList is typedef to std::list<UnicodeString> *tmp = another_string_list;,c++,heap,new-operator,allocation,C++,Heap,New Operator,Allocation,另一个_字符串_列表正在复制到堆内存中我的新的d Unicode DestringList中,但我最初从未指定堆内存应该有多大。编译器不知道另一个字符串列表有多大,所以堆中有多少内存 我很困惑,希望我已经详细说明了我的问题,以便有人能理解我,但我不确定 请帮忙 谢谢 朱利安你可能想看看新的功能。它将其放在堆内存而不是堆栈内存中。这样,当你失去视野时,它不会消失。它与已知的大小无关。 您可能会将其与数组混淆,在为数组分配内存时,您需要知道数组的大小,并且通常需要新建它。当您向数组添加元素时,std

另一个_字符串_列表正在复制到堆内存中我的新的d Unicode DestringList中,但我最初从未指定堆内存应该有多大。编译器不知道另一个字符串列表有多大,所以堆中有多少内存

我很困惑,希望我已经详细说明了我的问题,以便有人能理解我,但我不确定

请帮忙

谢谢


朱利安

你可能想看看新的功能。它将其放在堆内存而不是堆栈内存中。这样,当你失去视野时,它不会消失。它与已知的大小无关。
您可能会将其与数组混淆,在为数组分配内存时,您需要知道数组的大小,并且通常需要新建它。

当您向数组添加元素时,
std::list
的大小不会改变。我将使用一个
std::vector
,因为这个示例更简单,但同样的概念也适用:一个
std::vector
包含一个指向数组的指针,数组会根据需要动态调整大小以包含元素。指向数组的指针的大小不会改变(它是一个指针的大小),即使它所指向的数组发生了变化,但实际上只有在堆栈上才能知道它的大小。堆栈必须以非常静态的方式增长,以使编译器满意。但是,堆没有这样的约束


当您
new
something时,您在堆上分配它。因此,它可以是任何大小。令人惊讶的是,集合也可以在堆栈上分配。这是因为无论集合包含什么,其大小都是不变的。相反,它包含指向堆的信息(如指针),其中分配的大小必须是可变的。

所有“新”所做的就是分配足够的空间来存储
std::list
的所有成员变量。任何可能需要做的额外工作都是
std::list
的业务,它应该自己处理(通过其构造函数和析构函数)。

当您
新建
和对象时,您将获得该对象在初始状态下所需的内存。但是,您需要认识到,类在处理其内部状态时可能会实现相当多的复杂性

特别是对于您的问题,类(在您的例子中是
列表
)本身可以在it操作过程中动态分配和释放内存。这就是你的
列表
集合将要做的事情-当一个项目被添加到列表中时,它将为该项目分配内存,并执行管理该新项目所需的任何管理工作,通常使用指针或智能指针对象。因此,
列表
对象使用的内存可能会更改,但“核心”列表对象本身的大小与最初分配时的大小相同

当你“新”的东西时,你必须确切地知道你需要它有多大,对吗

不完全是。至少,不是你想的那样


当您
new
一个原始数组时,当然您必须提供数组中元素的数量。但是
std::list
std::vector
,这些都不是原始数组

std::list
为例:从外部看,您可以将其视为包含您放入其中的任何内容的东西。然而,在细节上,它是一个只直接包含指针的对象。这些指针指向它在堆上分配的其他对象(使用
new
)。因此,
std::list
的实例本身的大小总是相同的,但是当您向其添加更多内容时,它最终会在堆的其他位置分配更多内容来管理它

这也是为什么您可以使用列表作为堆栈分配的局部变量,而不需要将任何数量的项推入其中

UnicodeStringList MyList;
MyList.push_back(item1);
MyList.push_back(item2);
无需
新建
。列表安排自己的内部(堆分配)簿记,以容纳您想要添加到其中的“我的项目”


因此,当一个列表A分配给列表B时,列表A中的所有项目(以及任何内部管理的簿记对象)都会复制到新的堆分配项目中,并交给列表B进行管理。

是的,我知道它会进入堆。我的部分问题是:既然我告诉示例代码分配堆内存,但将未知大小的对象复制到其中,那么该示例代码的后果是什么?
std::list
是一个双链接列表。std::vector更适合您的示例。列表有一个静态大小,但是列表中有很多项。@zneak谢谢;我刚刚编辑了我的答案,说它实际上可能不使用数组,但我再次修改了它,在示例中只使用向量;这确实使zneak-Michael更容易解释+1,你应该相应地修改你的答案。编辑…:)在这里。在我的示例中,为什么向量比列表更好?我添加到集合中的任何项仍将放在堆上,对吗?我还想问一下,为什么要独立地堆分配列表。大多数人只需要将列表作为更大对象的一部分使用,而且由于您可以随时更改列表的内容,因此很少需要直接堆分配容器。