我正在调试在尝试将push_back调用到向量时出现seg错误的问题。 seg错误是第一次尝试向向量添加任何内容。出于调试目的,我在第一次尝试之前打印出容量和大小,结果是大小:529486,容量: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);
}
在一个简单的测试用例中,我并不想尝试提取重现的东西。这是我接下来的步骤之一。
无论如何,如果有人能指出我正确的方向,我很欣赏这个建议。谢谢!
答案 0 :(得分:0)
就我而言,结果是与构建相关的问题。
我更新了“主类”(伪代码中的ABCD)以添加新的向量。但是,声明该实例的文件未重建。为不存在的向量调用了push_back函数调用。
仅供参考...对不清楚原来的问题。由于我使用的代码与代码的工作部分相同,我的思路是我可能违反了某些堆栈约束,或者超出了与使用了多少向量相关的向量的默认设置。
答案 1 :(得分:-1)
std::vector::capacity()
和std::vector::size()
返回的垃圾很可能指向未初始化的对象。由于您的示例中的对象是全局的,我怀疑函数foo
是从另一个全局对象构造函数调用的。由于未定义全局对象的初始化顺序,因此可以使用不同的向量实例具有不同的行为。可能的解决方案 - 将singleton对象与本地静态对象一起使用:
ABCD &getInstance()
{
static ABCD theInstance;
return theInstance;
}
这种方式theInstance
将在第一次调用函数getInstance()
时初始化。这个方法并没有解决析构函数顺序的问题,你应该设计程序的方式是全局对象的destrutcors不应该调用其他全局对象的方法,或者使用不同的单例类型(例如phoenix)。