调整指针segfault的向量大小



我一直在尝试这种奇怪的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列表中的每个元素?

最新更新