在内存使用方面,以下两者有何不同:
std::vector<X*> vec其中每个元素都在堆中,但向量本身不在
和
std::vector<X>* vec其中向量在堆上声明,但每个元素(在堆栈上?)
第二种选择没有多大意义-它是否意味着向量指针在堆上,但它指向堆栈上的每个元素?
发布于 2013-09-23 01:17:46
std::vector<X*> vec是类X的指针数组。例如,在C++98中创建不可复制的类/对象数组(如std::fstream )时,这很有用。所以
std::vector<std::fstream> vec;是错误的,也不会起作用。但
std::vector<std::fstream*> vec;工作,而您必须为每个元素创建一个新对象,因此,例如,如果您想要5个fstream元素,您必须编写如下内容
vec.resize(5);
for(unsigned long i = 0; i < vec.size(); i++)
{
vec[i] = new std::fstream;
}当然,根据您的应用程序,还有许多其他用途。
现在第二种情况是向量本身的指针。所以:
vector<int>* vec;只是一个指针!它不携带任何信息,除非为向量本身创建对象,否则无法使用它,例如
vec = new vector<int>();最终,您可以将其用作:
vec->resize(5);现在这并不是很有用,因为矢量无论如何都会将它们的数据存储在堆上,并管理它们所携带的内存。所以,只有当你有很好的理由去做的时候才使用它,有时你会需要它。我脑海中没有任何关于它如何有用的例子。
发布于 2013-09-23 01:06:47
如果这是你真正想问的:
vector<X>* vec = new vector<X>();这意味着整个向量及其所有元素都在堆上。这些元素占用堆上的一个连续内存块。
发布于 2013-09-23 01:16:25
不同之处在于您需要在哪里(以及需要做什么)进行手动内存管理。
无论何时在C++中有一个原始的C风格的指针,您都需要进行一些手动的内存管理--原始指针可以指向任何东西,并且编译器不会自动为您进行任何构造或销毁。因此,你需要知道指针指向哪里,以及谁“拥有”了剩余代码中指向的内存。
所以当你有了
std::vector<X*> vec;您不需要担心向量本身的内存管理(编译器将为您做这件事),但您确实需要担心放入向量中的指针的指向X对象的内存管理。如果你用new来分配它们,你需要确保在某个时候手动delete它们。
当你有了
std::vector<X> *vec;您确实需要担心向量本身的内存管理,但您不需要担心单个元素的内存管理。
最简单的是如果你有:
std::vector<X> vec;然后,您根本不需要担心内存管理--编译器将为您处理它。
https://stackoverflow.com/questions/18946425
复制相似问题