c++ - 填充指向 vector 的 vector

标签 c++ memory vector new-operator

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

相关文章:

c++ - opencv2/tracking.hpp : No such file or directory on Ubuntu 16. 04

c++ - 在 C++ 中使用 stringstream 和一个 int 变量来验证输入是一个 int

c++ - 自定义 QComboBox

windows - 运行 NDSolve 时内存耗尽

linux - 如何只显示 Docker 容器中分配的资源?

c++ - 分配包含 STL vector 的结构时发生内存泄漏

c++ - 如果没有 endl,则重载 ostream 运算符段错误

c++ - 实现 Employee 类的更好选择是什么?

c++ - 在没有 IDE 的情况下编译单个文件,c++

c - 二维/多维数组的内存映射