具有奇数大小的c++ STL向量,在添加任何内容之前容量为0
C++ STL vector with odd size, 0 capacity before anything is added
我正在调试一个问题,在尝试调用push_back到向量时存在segfault。第一次尝试向向量中添加任何东西时,就会出现segfault。出于调试的目的,我在第一次尝试之前打印出了capacity和size,结果是size: 529486, capacity: 0。
令人沮丧的部分是,这是一个附加向量,遵循用于处理其他向量的相同公式,而这些向量也可以工作。大小和容量与其他向量的行为一致。
作为我正在做的事情的粗略伪代码:
class NEWTYPE{
public:
Object* objPtr;
NEWTYPE();
void update(float );
void setObject(Object* o);
};
class ABCD{
std::vector<TYPE1*> type1List;
std::vector<TYPE2*> type2List;
std::vector<TYPE3*> type3List;
std::vector<TYPE4*> type4List;
std::vector<TYPE5*> type5List; // <== there were 5 other vectors working
std::vector<NEWTYPE*> NEWTYPEList;
}
void ABCD::addType1(TYPE1* n){
cout << type1List.size() << type1List.capacity; // <== as expected
type1List.push_back(n); // <== Works for each old type
}
void ABCD::addNewType(NEWTYPE* n){
cout << NEWTYPEList.size() << NEWTYPEList.capacity; // size: 529486, capacity:0 before first call
NEWTYPEList.push_back(n); // <== seg fault
}
ABCD instance;
// foo() : This procedure works correctly for the other vectors
void foo(){
NEWTYPE* test;
test = new NEWTYPE();
instance.addNewType(test);
}
我不太想在一个简单的测试用例中提取东西来重现。这是我下一步要做的。
无论如何,如果有人能在这个问题上给我指出正确的方向,我很感激你的建议。谢谢!在我的例子中,这是一个与构建相关的问题。
我更新了"主类"(伪代码中的ABCD)以添加新的向量。但是,没有重新构建声明实例的文件。对于不存在的vector对象调用push_back函数。
通知你…对不起,我没有把我最初的问题说清楚。由于我使用了与代码工作部分相同的过程,我的思路是,我可能违反了一些堆栈约束,或者超出了与使用多少向量相关的向量的默认设置。
std::vector::capacity()
和std::vector::size()
返回的垃圾很可能指向未初始化的对象。在你的例子中的对象是全局的,我怀疑函数foo
从另一个全局对象构造函数调用。由于全局对象的初始化顺序没有定义,您可以对不同的向量实例具有不同的行为。可能的解决方案-使用带有局部静态对象的单例对象:
ABCD &getInstance()
{
static ABCD theInstance;
return theInstance;
}
这样theInstance
将在第一次调用getInstance()
函数时被初始化。这个方法并不能解决析构函数顺序的问题,但是你应该这样设计你的程序:全局对象的析构函数不应该调用其他全局对象的方法,或者使用不同的单例类型(例如phoenix)。
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- UE4 - Visual Studio在我从编辑器添加新的c ++文件后无法打开任何源文件 - UBT_COMPILED
- 在大括号内添加语句会更改代码功能?
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- C++ 中是否有任何内置阶乘函数?
- 是否有任何内置函数可以告诉编译器分支是否可预测
- 在范围内添加位操作和转换式的枚举 - 圣诞节探索
- 如何在数组中的范围内添加所有数字?然后找到该范围的平均值
- 我需要在C /C#中使用图形.我可以使用任何内置的C /C#库
- 是否有任何内置类可以处理C 中的大整数值
- c ++中是否有任何内置功能可以在计划的时间运行任务
- 是否有任何内置的 UTF 在 c++ 在窗口中
- 在VC++2010中执行任何内置的ARRAY函数
- C++:如何在不使用任何内置函数的情况下将字符串转换为整数
- 是否有任何内置的CUDA函数允许CUDA内核向主机代码报告错误?
- 我如何在常数时间(O(1))内获得字母表(1-26)中字符的数值/位置,而不使用任何内置方法或函数
- C++中的任何内置哈希方法
- c++库中的任何内置夹子方法