C++ C++;带容器的堆栈限制
我在循环(堆栈)中定义结构,然后将它们移动到向量中。程序编译并运行,但似乎表现出意外的行为。为了便于比较,我可以分配结构,并通过指向其地址的指针引用它们——这是可以预期的。但是为什么我不能把结构放在堆栈上呢?结构不包含太多数据,但它们确实包含包含更多数据的容器。好奇,如果您有任何意见,我将不胜感激C++ C++;带容器的堆栈限制,c++,C++,我在循环(堆栈)中定义结构,然后将它们移动到向量中。程序编译并运行,但似乎表现出意外的行为。为了便于比较,我可以分配结构,并通过指向其地址的指针引用它们——这是可以预期的。但是为什么我不能把结构放在堆栈上呢?结构不包含太多数据,但它们确实包含包含更多数据的容器。好奇,如果您有任何意见,我将不胜感激 struct D { std::vector<int> A; }; std::vector<D> VD; D init_d(unsigned &i) { a
struct D
{
std::vector<int> A;
};
std::vector<D> VD;
D init_d(unsigned &i)
{
auto f { [](unsigned &i) { ... } };
D d { f(i) };
return d;
}
void initializer(void)
{
for (unsigned i = 0; i < N; i++)
VD.emplace_back(init_d(i));
}
struct D
{
std::载体A;
};
std::矢量VD;
D初始值D(未签名&i)
{
自动f{[](无符号&i){…};
D{f(i)};
返回d;
}
无效初始值设定项(void)
{
for(无符号i=0;i
您在函数范围外使用局部变量是正确的,它将显示未定义的行为
在堆栈上分配结构的问题是,从函数调用返回后,它在堆栈上的生命周期中占用的所有空间都被释放(包括局部变量,如结构)
为了澄清这一点,假设我调用
initializer()
,然后调用另一个函数foo()
,foo将使用的空间与堆栈上分配结构的空间相同。相反,如果在initializer()
之后没有调用函数,则程序应该运行正常。在函数范围之外使用局部变量是正确的,将显示未定义的行为
在堆栈上分配结构的问题是,从函数调用返回后,它在堆栈上的生命周期中占用的所有空间都被释放(包括局部变量,如结构)
为了澄清这一点,假设我调用
initializer()
,然后调用另一个函数foo()
,foo将使用的空间与堆栈上分配结构的空间相同。相反,如果在initializer()
之后没有调用函数,程序应该运行正常。显示的代码没有明显的错误,因此问题一定是没有显示的代码,当然,没有人可以对没有显示的代码提供任何帮助。您需要按照stackoverflow.com的说明创建一个。您需要回答您的问题并更新显示的代码,以使其满足a的所有要求。还要注意,如果定义VD
时已知N
,则可以通过将VD
定义为:std::vector VD(N)来消除初始值设定项
代码>显示的代码没有明显的错误,所以问题一定是没有显示的代码,当然,没有人可以对没有显示的代码提供任何帮助。您需要按照stackoverflow.com的说明创建一个。您需要回答您的问题并更新显示的代码,以使其满足a的所有要求。还要注意,如果定义VD
时已知N
,则可以通过将VD
定义为:std::vector VD(N)来消除初始值设定项
代码>我会接受的。非常感谢。简单明了的解释。再次您好,Liad,看起来您为社区提供了有用的答案,这太棒了!我建议你看看不同的选项,以提高答案的可读性!例如,您可以在文本周围使用Ctrl+k
或两个`。示例:请参见答案上的编辑请求@OS2如果此答案是解决方案,请按此标记!:)他们以民主方式投票结束了这个问题,而不是回答它。我会接受的。非常感谢。简单明了的解释。再次您好,Liad,看起来您为社区提供了有用的答案,这太棒了!我建议你看看不同的选项,以提高答案的可读性!例如,您可以在文本周围使用Ctrl+k
或两个`。示例:请参见答案上的编辑请求@OS2如果此答案是解决方案,请按此标记!:)他们以民主方式投票结束这个问题,而不是回答它。