我是c++的新手,我正在尝试创建一个std::向量数组,但每当我推送一个新元素时,似乎所有以前的元素都会被我刚刚添加的新值覆盖。(我需要使用c++默认数组,而不是std::array或其他容器,因为我需要将它们传递给只接受这些数组的函数(。
以下代码和输出显示了正在发生的事情的示例:
std::vector<int*> tuples;
for( int i = 0; i < 10; i++ )
{
for( int j = 0; j < 5; j++ )
{
int tuple[] = { i, j };
tuples.push_back( tuple );
}
}
for( int i = 0; i < tuples.size(); i++ )
std::cout << i << " " << tuples[i][0] << " " << tuples[i][1] << std::endl;
在末尾,向量中的每个数组都有元素{9,4},这是i和j分别达到的最后一个值
在循环的每一次迭代中,您不是在推回数组,而是将指针推回到一个具有自动存储持续时间的数组,然后该指针超出范围。(从概念上讲,每次迭代都会创建一个新的数组,尽管在实践中编译器会优化它。(
因此,您最终得到了一个由悬挂指针组成的std::vector
,并且尝试取消引用这些指针时的行为是未定义的。
一种解决方案是将std::array
用于std::vector
有效载荷。请注意,std::array
有一个生成底层数组的data()
函数,这将提供与需要int*
参数的函数的兼容性。