gpt4 book ai didi

c++ - 关于 vector 的内存行为的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:57 28 4
gpt4 key购买 nike

最近我对 std::vectors 的内存(取消)分配有点困惑

假设我得到了整数的法线 vector : 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() vector 被创建,一个foo_t实例被创建,实例被填充并被推送到 vector 。因此,当我离开该函数时, vector 会被释放,内容(这里是一个 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;
}

根据我的理解, vector 及其内容存在于堆栈中,堆栈(最终)会被时间覆盖,我返回的 vector 及其内容将无用。还是它实际上返回了一个 vector 的拷贝及其内容的拷贝(如果它不是 POD,则需要内容数据类型的复制构造函数)?

还有一些显而易见的事情:

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;
}

现在我必须手动迭代 vector ,删除其内容,然后我才能安全地让 vector 超出范围,对吧?

最佳答案

这个例子:

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);
}

hurv() 之后完成,foovfoo都被释放了。

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;
}

结果 std::vector<foo_t>hurr()对 1 foo_t 有效在其中并且它是有效的。return foov; 可以调用std::vector<foo_t>的复制构造函数, 它可以自由地不制作该拷贝,请参阅 copy elision

无论如何,从 C++11 开始,您可以这样写:

struct foo_t{
std::string bar;
unsigned int derp;
// we will copy the string anyway, pass-by-value
foo_t(std::string bar_, unsigned int d_)
: bar(std::move(bar_)), derp(d_) {}
};
std::vector<foo_t> hurr(){
std::vector<foo_t> foov;
// This is better, in place construction, no temporary
foov.emplace_back("Sup?", 1337);
// This require a temporary
foov.push_back(foo_t{"Sup?", 1337});
return foov;
}

并且,对于最后一个示例,是的,您必须手动遍历 vector ,删除其内容,然后当您不再想使用时,我可以安全地让 vector 超出范围 hurr() 的结果, (不在 hurr() 中)

关于c++ - 关于 vector 的内存行为的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40357745/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com