gpt4 book ai didi

c++ - 填充指向 vector 的指针的 vector

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:09 26 4
gpt4 key购买 nike

我有一个指向 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));

由于两个原因,您的情况有问题-

  1. 它会导致内存泄漏,因为 new 创建的对象被复制wavefunctions , 然后指向它的指针丢失了。这不是 Java...
  2. 它分配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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com