具有奇数大小的c++ STL向量,在添加任何内容之前容量为0

C++ STL vector with odd size, 0 capacity before anything is added

本文关键字:任何内 添加 容量 向量 STL c++      更新时间:2023-10-16

我正在调试一个问题,在尝试调用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)。