我刚读了this post on SO,讨论了存储器中存储STL向量的位置。根据接受的答案,
vector<int> temp;
堆栈上向量的头信息,但堆上的内容。
在这种情况下,以下代码是否会出错?
vector<int> some_function() {
vector<int> some_vector;
some_vector.push_back(10);
some_vector.push_back(20);
return some_vector;
}
我应该使用vector<int> *some_vector = new vector<int>
吗?以上代码会导致一些内存分配问题的代码吗?如果我使用自定义类的实例而不是int
?
答案 0 :(得分:8)
您的代码非常精确。
Vectors管理他们为你分配的所有内存。
它们是否使用动态分配存储所有内部数据无关紧要,或者将某些元数据保存为直接成员(自动存储持续时间)。内部执行的任何动态分配都将在向量的析构函数,复制构造函数和其他类似的特殊函数中安全地清理。
您不需要做任何事情,因为所有这些都是从代码中抽象出来的。您的代码无法看到该机制,动态分配向量本身不会对其产生任何影响。
这就是他们的目的!
答案 1 :(得分:2)
如果您决定动态分配矢量,即使在非常简单的情况下也很难正确地销毁它(不要忘记异常!)。尽可能不惜一切代价避免动态分配。
换句话说,您的代码完全正确。我不担心在内存中复制返回的向量。在这些简单的情况下,编译器(在发布版本中)应该使用返回值优化/ RVO(http://en.wikipedia.org/wiki/Return_value_optimization)并在返回的对象的内存中创建some_vector。在C ++ 11中,您可以使用移动语义。
但是如果你真的不相信使用RVO的编译器,你总是可以将一个引用传递给一个向量并将其填入函数内部。
//function definition
void some_function(vector<int> &v) { v.push_back(10); v.push_back(20); }
//function usage
vector<int> vec;
some_function(vec);
回到动态分配,如果你真的需要使用它,请尝试名为RAII的模式。或者使用智能指针。
答案 2 :(得分:1)
内部向量定义数据的位置并不重要,因为你通过复制返回向量。:)(按值)它就像返回一个整数一样
int some_function()
{
int x = 10;
return x;
}