C++ C++;奇数大小的STL向量,添加任何内容之前的容量为0
我正在调试一个问题,在尝试将push_调用回向量时出现seg故障。seg故障是首次尝试向向量添加任何内容。出于调试目的,我在第一次尝试之前打印了容量和大小,结果是大小:529486,容量: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
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函数调用
仅供参考…很抱歉,我的原始问题不清楚。由于我使用的程序与代码的工作部分相同,我的思路是,我可能违反了某些堆栈约束,或者超出了与使用的向量数量相关的向量的默认设置。请准备一个。请用一个或多个来回答您的问题可能有数不清的问题,但归根结底是:内存损坏。溢出/下溢、垃圾/悬空指针、返回临时地址、不正确的复制构造函数/赋值运算符等。对一个糟糕的问题,投票结果不佳。您提供了一种解决方案,并直接反对使用它。