首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vector<X*> vec vs vector<X>* vec

vector<X*> vec vs vector<X>* vec
EN

Stack Overflow用户
提问于 2013-09-23 01:04:01
回答 4查看 203关注 0票数 4

在内存使用方面,以下两者有何不同:

代码语言:javascript
复制
std::vector<X*> vec

其中每个元素都在堆中,但向量本身不在

代码语言:javascript
复制
std::vector<X>* vec

其中向量在堆上声明,但每个元素(在堆栈上?)

第二种选择没有多大意义-它是否意味着向量指针在堆上,但它指向堆栈上的每个元素?

EN

回答 4

Stack Overflow用户

发布于 2013-09-23 01:17:46

代码语言:javascript
复制
std::vector<X*> vec

是类X的指针数组。例如,在C++98中创建不可复制的类/对象数组(如std::fstream )时,这很有用。所以

代码语言:javascript
复制
std::vector<std::fstream> vec;

是错误的,也不会起作用。但

代码语言:javascript
复制
std::vector<std::fstream*> vec;

工作,而您必须为每个元素创建一个新对象,因此,例如,如果您想要5个fstream元素,您必须编写如下内容

代码语言:javascript
复制
vec.resize(5);
for(unsigned long i = 0; i < vec.size(); i++)
{
    vec[i] = new std::fstream;
}

当然,根据您的应用程序,还有许多其他用途。

现在第二种情况是向量本身的指针。所以:

代码语言:javascript
复制
vector<int>* vec;

只是一个指针!它不携带任何信息,除非为向量本身创建对象,否则无法使用它,例如

代码语言:javascript
复制
vec = new vector<int>();

最终,您可以将其用作:

代码语言:javascript
复制
vec->resize(5);

现在这并不是很有用,因为矢量无论如何都会将它们的数据存储在堆上,并管理它们所携带的内存。所以,只有当你有很好的理由去做的时候才使用它,有时你会需要它。我脑海中没有任何关于它如何有用的例子。

票数 3
EN

Stack Overflow用户

发布于 2013-09-23 01:06:47

如果这是你真正想问的:

代码语言:javascript
复制
vector<X>* vec = new vector<X>();

这意味着整个向量及其所有元素都在堆上。这些元素占用堆上的一个连续内存块。

票数 0
EN

Stack Overflow用户

发布于 2013-09-23 01:16:25

不同之处在于您需要在哪里(以及需要做什么)进行手动内存管理。

无论何时在C++中有一个原始的C风格的指针,您都需要进行一些手动的内存管理--原始指针可以指向任何东西,并且编译器不会自动为您进行任何构造或销毁。因此,你需要知道指针指向哪里,以及谁“拥有”了剩余代码中指向的内存。

所以当你有了

代码语言:javascript
复制
std::vector<X*> vec;

您不需要担心向量本身的内存管理(编译器将为您做这件事),但您确实需要担心放入向量中的指针的指向X对象的内存管理。如果你用new来分配它们,你需要确保在某个时候手动delete它们。

当你有了

代码语言:javascript
复制
std::vector<X> *vec;

您确实需要担心向量本身的内存管理,但您不需要担心单个元素的内存管理。

最简单的是如果你有:

代码语言:javascript
复制
std::vector<X> vec;

然后,您根本不需要担心内存管理--编译器将为您处理它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18946425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档