为什么valarray分配没有根据文档调整受让人的大小
Why does valarray assignment not resize assignee per the documentation?
代码:
#include <valarray>
#include <iostream>
using namespace std;
int main()
{
valarray<int> v0(2, 4);
valarray<int> v1;
v1 = v0;
cout << "v0.size: " << v0.size() << endl;
cout << "v1.size: " << v1.size() << endl;
cout << "v0[0]: " << v0[0] << endl;
cout << "v1[0]: " << v1[0] << endl;
}
输出:
v0.size: 4
v1.size: 0
v0[0]: 2
Segmentation fault
任务:
v1 = v0;
我认为构造函数:
valarray<T>& operator=( const valarray<T>& other );
应该使用,根据文档,我认为应该调整v1的大小,并将v0的内容逐个复制到其中。那么到底发生了什么呢?
$ g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
因为您使用的是旧的C++。
从C++11开始,目的地的大小将调整为与源相匹配
这就是为什么这里的一些贡献者无法复制您的问题(另外,UB有不可预测的结果(这也是cppreference.com文章指出首先执行调整大小的原因(尽管免责声明这只适用于C++11可能很好([现在已经修复。]
[C++11: 23.6.2.3]
valarray赋值[valarray.assign]
valarray<T>& operator=(const valarray<T>& v);
1
*this
数组的每个元素都被分配了变元数组的相应元素的值。如果v
的长度不等于*this
的长度,则在执行分配之前,调整*this
的大小以使两个阵列的长度相同,就像通过调用resize(v.size())
一样。2 后置条件:
size() == v.size()
。
但是,在C++03中,您的代码有未定义的行为
这就是为什么旧的工具链会出现分段错误的原因。这也是为什么,当这个问题在2003年作为GCC错误被提出时,它被认为是无效的,因为当时的实现实际上是一致的。
[C++03: 23.3.2.2]
valarray赋值[valarray.assign]
valarray<T>& operator=(const valarray<T>& v);
1
*this
数组的每个元素都被分配了变元数组的相应元素的值。如果参数数组的长度不等于*this
数组的长度,则生成的行为是未定义的。
- 为char数组调整zlib-zpipe
- 调整大小后指向元素值的指针unordered_map有效?
- 在C++中调整向量中的索引
- 哪些库可以通过Opencv调整曝光率
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- 在容量内调整矢量大小时的性能影响
- 将 boost::odeint 与向量类一起使用,而无需调整向量的大小
- 将摄像机调整到俯视图
- Qt 图表条形图调整大小崩溃
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 调整布局上的 QGraphicsView 小部件的大小
- 如何在构建链接列表时调整头、尾指针
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 当您在此单词中搜索单词时调整字符数组的大小?
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何按另一个向量的方向调整一个向量?
- 使用大小调整大小调整 wxListView 的大小
- 调整大小和复制哈希表数组中的元素
- 为什么valarray分配没有根据文档调整受让人的大小