【发布时间】:2017-03-14 10:55:07
【问题描述】:
我最近对std::vectors的内存(取消)分配有点困惑
假设我得到了整数的法线向量:
std::vector<int> intv; 当我 push_back 一些 int 时,它会随着时间而增长。当我离开函数的作用域(即)时,它会在不需要额外调用的情况下被释放。
太好了。再举一个例子:
struct foo_t{
std::string bar:
unsigned int derp;
}
void hurr(){
std::vector<foo_t> foov;
foo_t foo;
foo.bar = "Sup?";
foo.derp = 1337;
foov.push_back(foo);
}
好的。当我调用hurr() 时,向量被创建,foo_t 实例被创建,实例被填充并被推送到向量。所以当我离开函数时,向量被释放,内容(这里是foo_t)也被释放?
下一个例子:
struct foo_t{
std::string bar:
unsigned int derp;
}
std::vector<foo_t> hurr(){
std::vector<foo_t> foov;
foo_t foo;
foo.bar = "Sup?";
foo.derp = 1337;
foov.push_back(foo);
return foov;
}
据我了解,向量及其内容存在于堆栈中,堆栈(最终)会被时间覆盖,而我返回的向量及其内容将毫无用处。或者它实际上是否返回了向量的副本及其内容的副本(如果它不是 POD,则需要内容数据类型的 Copy-Constructor)?
还有一些显而易见的事情:
struct foo_t{
std::string bar:
unsigned int derp;
}
std::vector<foo_t*> hurr(){
std::vector<foo_t*> foov;
foo_t foo = new foo_t;
foo->bar = "Sup?";
foo->derp = 1337;
foov.push_back(foo);
return foov;
}
现在我必须手动迭代向量,删除它的内容,然后我可以安全地让向量超出范围,对吧?
【问题讨论】:
-
“现在我必须手动迭代向量,删除它的内容,然后我可以安全地让向量超出范围,对吧?” 是的。
-
"现在我必须手动迭代向量,删除其内容,然后我可以安全地让向量超出范围,对吗?"这将使返回向量中的指针无效。除非那是你想要的,而且很可能不是,否则你不应该这样做。
-
@molbdnilo 取决于现在应该何时发生。
-
@πάνταῥεῖ 我知道它发生在函数返回之前:“遍历向量,删除其内容然后 [...]超出范围”。
-
@πάνταῥεῖ @molbdnilo “现在”是在我使用
hurr()返回的向量之后,不再需要它了。