【发布时间】:2014-08-17 00:01:38
【问题描述】:
最近在重读ISO C++标准,发现很有意思的注释:
请注意,对于
std::vector,std::vector<T>类型T的唯一约束是T类型必须具有复制构造函数。实际上,如果插入时vector的内存已满,则分配size = 2 * oldSize的新内存(这取决于实现),然后将其中的旧元素复制并插入该元素。
但是等等??
要分配类型的新内存,我们需要这样的东西,ptr = new T[2*size];
- 这是怎么做到的,因为
T类型可能没有默认构造函数? - 然后Assignment,分配完内存后我们必须将旧值赋给新内存,对吧?
- 考虑到这两件事,
std::vector如何使用“ONLY COPY CONSTRUCTOR”来做到这一点?使用了哪些实现和语言习语?
【问题讨论】:
-
数组-
new没有完成。正如您刚刚发现的那样,Array-new完全是该语言的错误功能并且完全没用。相反,内存分配和对象构造是完全独立完成的。 -
如果没有提供明确的默认编译器,编译器会生成一个。
-
@littleadv 如果该类具有任何类型的用户定义构造函数,则没有编译器生成的默认构造函数
-
@KerrekSB 为什么你会说某些东西完全没用,只是因为它不适合这种情况? Array-
new适合分配数组。您可以争辩说显式手动分配是不好的(在这种情况下,您反对new、delete、new[]和delete[]以及可能的原始指针),但这与争论只有数组-@987654336 不同@ 不好。 -
@immibis:动态数组在概念上被破坏了。你不能在不知道它的大小的情况下使用动态数组,所以你必须单独携带大小信息,这违反了封装。雪上加霜的是,编译器无论如何都需要复制大小信息才能调用析构函数。简短的回答是,只需使用
std::vector。
标签: c++ vector stl copy-constructor assignment-operator