调整指针段错误向量的大小

Posted

技术标签:

【中文标题】调整指针段错误向量的大小【英文标题】: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 的回答可能会帮助您查明段错误的来源。 【参考方案1】:

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

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

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

【讨论】:

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

以上是关于调整指针段错误向量的大小的主要内容,如果未能解决你的问题,请参考以下文章

C++ 为啥在向量段错误中放置对象?

为啥在这段代码中向量比指针使用更少的内存?

C ++ 11分段错误试图将数组(<算法>)动态复制到向量中

pq:无法调整共享内存段的大小。设备上没有剩余空间

在向量 C++ 中处理指针

c++ 类向量中的段错误