1

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。如果改为选择较低的值resize,则代码可能根本不会出现段错误。

更新: 问题在于,与初始化列表所指示的相反,w_v_. 因此,在 中init_w()v_状态是未定义的。恢复声明v_w_声明中的顺序可以解决问题。

4

1 回答 1

2

问题是,与初始化列表所表明的相反, w_ 在 v_ 之前被初始化

你推断是这样,但实际上并非如此。列表的顺序不相关;类中的声明顺序是。因此,如果您想查看成员的实际初始化方式,您的初始化列表应该模仿声明顺序。

我的问题是;为什么要使用指针向量开始?您是否意识到delete在您的对象超出范围或遭受内存泄漏之前您需要列表中的每个元素?

于 2012-07-26T23:46:05.360 回答