奇怪的C ++ STL向量,添加任何东西之前的0容量

时间:2015-10-13 15:06:50

标签: c++ vector stl

我正在调试在尝试将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);
}

在一个简单的测试用例中,我并不想尝试提取重现的东西。这是我接下来的步骤之一。

无论如何,如果有人能指出我正确的方向,我很欣赏这个建议。谢谢!

2 个答案:

答案 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)。