【发布时间】:2013-12-28 19:51:52
【问题描述】:
我有一个小代码 sn-p 在运行时会产生错误。以下代码存储 mystruct 的数据并创建一个指针向量,该向量存储相应数据的地址。
struct mystruct{
std::vector < int > someinfo;
int somenumbers;
double *somepointer;
double someparm;
void Print(){....}
};
void DoSomething(mystruct &_somestruct, std::vector< mystruct > &_somevec,
std::vector<mystruct *> &_ptr){
_somevec.push_back(_somestruct);
_ptr.push_back(&(_somevec.back()));
}
void ReadStruct(){
std::vector<mystruct > _vec;
std::vector<mystruct *> _ptr;
for(int i=0;i<100;i++){
mystruct _struct;
_struct.somenumbers = 3;
_struct.someinfo.push_back(0);
_struct.someinfo.push_back(1);
_struct.someinfo.push_back(2);
DoSomething(_struct, _vec, _ptr);
}
_vec[0].Print(); //Prints correctly
_ptr[0]->Print();//Prints garbage info
}
如果我先创建向量,然后创建指针向量,那么代码就可以完美运行,即
void DoSomething(mystruct &_somestruct, std::vector< mystruct > &_somevec){
_somevec.push_back(_somestruct);
//_ptr.push_back(&(_somevec.back()));
}
void DoSomething1(std::vector< mystruct > &_somevec, std::vector<mystruct *> &_ptr){
for(int i=0;i<_somevec.size();i++)
_ptr.push_back(&(_somevec[i]));
}
我不知道我在做什么错误。非常感谢您的帮助/意见!
【问题讨论】:
-
请缩进您的代码以使其可读。谢谢。
-
指针版本是未定义的行为,因为
_struct超出范围并在每次循环迭代后被破坏,非指针版本通过复制结构来工作。 -
@Mgetz 但它不是存储在 _somevec 中吗?我正在存储 _somevec 的地址。
-
@SumanVajjala no,
_somevec存储一个副本而不是原始结构,如果您打算存储一个指针,您应该使用new在堆上显式分配它