我有一个指向 vector 的指针 vector :
main(...)
{
//...
std::vector< std::vector<double> * > ds = getDS(...)
//...
}
std::vector<std::vector<double> * > getDS(int m, ...)
{
std::vector<std::vector<double> * > wavefunctions = *(new std::vector<std::vector<double>*>(m));
int n = int( params.rmax() / params.dr() );
std::ifstream input_wf;
input_wf.open(filename.c_str());
input_wf.setf(std::ios::showpoint | std::ios::scientific);
for(int i=0; i < nbasis; i++)
{
std::vector<double> *wf = new std::vector<double>(n);
//(wavefunctions[i]) = new std::vector<double>(n);
for (unsigned int ir=0; ir < wf->size(); ir++)
input_wf >> ( *wf )[ir];
wavefunctions.push_back(wf);
}
input_wf.close();
return wave functions;
}
但是,当我在调试过程中经过一次循环后尝试访问 wavefunctions[0]->at(some legal value)
时,我不断收到 EXC_BAD_ACCESS 错误。 (那里应该有一些东西,但我不确定为什么没有......有什么想法吗?
最佳答案
下面一行,
std::vector<std::vector<double> * > wavefunctions = *(new std::vector<std::vector<double>*>(m));
您的情况存在问题,原因有两个 -
- 它会导致内存泄漏,因为
new
创建的对象被复制到wavefunctions
,然后指向它的指针就会丢失。这不是 Java... - 它分配
m
vector 中的条目。后续push_back
添加到m
条目,因此当您尝试访问wavefunctions[0]
时您实际上访问的是在这一行中创建的条目,而不是for
中推送的第一个条目。循环。
要解决该问题,请将行更改为
std::vector<std::vector<double> * > wavefunctions;
wavefunctions.reserve(m);
reserve
方法确保您在push_back
期间不会进行重新分配。的。
最后一点,根据具体情况,编译器可能会或可能不会优化从函数返回时执行的 vector 的固有拷贝。可以肯定的是,您可能想了解有关右值引用 ( &&
) 的更多信息,或者只是按地址返回 vector (即,作为类型 vector<...> *
的另一个参数并返回类型 void
)。
关于c++ - 填充指向 vector 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11513559/