【问题标题】:resizing vector of pointers segfaults调整指针段错误向量的大小
【发布时间】:2012-07-26 18:38:35
【问题描述】:

我一直遇到这种奇怪的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_ 的顺序可以解决此问题。

【问题讨论】:

  • 请给出一个显示问题的最小编译示例。
  • @rhalbersma 我已经努力了几个小时将代码分解成一些小而简单的代码,但失败了,但没有成功。我知道这使得很难找到错误。
  • @Nico:不难,不可能。恐怕我是-1。
  • @chris 没关系,因为向量元素类型是指针。
  • this similar question 的回答可能会帮助您查明段错误的来源。

标签: c++ vector resize segmentation-fault


【解决方案1】:

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

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

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

【讨论】:

  • 确实是声明的顺序。一些编译器甚至会在项目以其他初始化顺序声明时发出警告。我使用指针向量的原因是我使用的库需要这种格式。特别是,我调用的向量填充例程将std::vector&lt;entity*&gt; 作为参数。
  • 这个问题如何回答answers这个问题?
  • @Nico:啊,好吧,那就小心点(那很臭,但是哦,你无能为力。)
  • @JayD:初始化顺序是问题。 init_w()_v 初始化之前调用 _v.resize()
猜你喜欢
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多