调整指针段错误向量的大小
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<entity*>
作为参数。
这个问题如何回答answers
这个问题?
@Nico:啊,好吧,那就小心点(那很臭,但是哦,你无能为力。)
@JayD:初始化顺序是问题。 init_w()
在 _v
初始化之前调用 _v.resize()
。以上是关于调整指针段错误向量的大小的主要内容,如果未能解决你的问题,请参考以下文章