我一直在尝试这种奇怪的std::vector
行为,我对此一无所知。
大致上,代码看起来像
#include <iostream>
#include <vector>
class MyClass{
public:
MyClass():
v_(),
w_(init_w())
{};
~MyClass()
{};
std::vector<int*> init_w()
{
v_.resize(4096);
return v_;
};
private:
std::vector<int*> w_;
std::vector<int*> v_;
};
int main()
{
MyClass a;
}
运行此操作会在resize
上出现错误的segfault。如果为resize
选择一个较低的值,则代码可能根本不会segfault。
更新:问题是,与初始化器列表所指示的相反,w_
在v_
之前被初始化。因此,在init_w()
中,v_
状态是未定义的。恢复声明中v_
和w_
的顺序可以修复此问题。
问题是,与初始化器列表所示相反,w_在v_之前初始化
你推断是这样的,但事实并非如此。名单的顺序不相关;类中的声明顺序是。因此,如果您想查看成员是如何被初始化的,初始化列表应该模仿声明顺序。
我想问你的是:;为什么一开始就使用指针向量?您是否意识到,在对象超出范围或发生内存泄漏之前,您需要delete
列表中的每个元素?