Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;带容器的堆栈限制_C++ - Fatal编程技术网

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如果此答案是解决方案,请按此标记!:)他们以民主方式投票结束这个问题,而不是回答它。