C++ C++;奇数大小的STL向量,添加任何内容之前的容量为0

C++ C++;奇数大小的STL向量,添加任何内容之前的容量为0,c++,vector,stl,C++,Vector,Stl,我正在调试一个问题,在尝试将push_调用回向量时出现seg故障。seg故障是首次尝试向向量添加任何内容。出于调试目的,我在第一次尝试之前打印了容量和大小,结果是大小:529486,容量:0 令人沮丧的是,这是一个附加向量,遵循用于处理其他向量的相同公式,并且这些公式也适用。大小和容量与这些其他向量的预期行为相同 作为我所做工作的粗略伪代码: class NEWTYPE{ public: Object* objPtr; NEWTYPE(); void update(f

我正在调试一个问题,在尝试将push_调用回向量时出现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);
}
class新类型{
公众:
对象*objPtr;
NEWTYPE();
无效更新(浮动);
void setObject(Object*o);
};
类ABCD{
std::向量类型列表;
std::向量类型2列表;
std::向量类型3列表;
std::向量类型4列表;

std::vector type5List;//垃圾由
std::vector::capacity()和
std::vector::size()返回
最有可能指向未初始化的对象。由于示例中的对象是全局对象,我怀疑函数
foo
是从另一个全局对象构造函数调用的。由于未定义全局对象的初始化顺序,您可以对向量的不同实例有不同的行为。可能的解决方案-使用带有本地静态对象:

ABCD &getInstance()
{
    static ABCD theInstance;
    return theInstance;
}

这样一来,当第一次调用函数
getInstance()
时,就会初始化实例
。虽然此方法不能解决析构函数顺序的问题,但您应该设计程序,使全局对象的析构函数不调用其他全局对象的方法,或者使用不同的单例类型(例如phoenix)。

在我的例子中,这是一个与构建相关的问题

我更新了“master class”(伪代码中的ABCD)以添加新向量。但是,声明实例的文件没有被重建。为不存在的向量调用了push_-back函数调用


仅供参考…很抱歉,我的原始问题不清楚。由于我使用的程序与代码的工作部分相同,我的思路是,我可能违反了某些堆栈约束,或者超出了与使用的向量数量相关的向量的默认设置。

请准备一个。请用一个或多个来回答您的问题可能有数不清的问题,但归根结底是:内存损坏。溢出/下溢、垃圾/悬空指针、返回临时地址、不正确的复制构造函数/赋值运算符等。对一个糟糕的问题,投票结果不佳。您提供了一种解决方案,并直接反对使用它。