删除二维数组

Deleting 2-dimensional array

本文关键字:二维数组 删除      更新时间:2023-10-16

我在vector中存储了一个文本文件列表,并且希望在每次迭代时将文本文件的内容读入二维数组:

for(unsigned i=0; (i < files.size()); i++)
{
    std::string file = dir + "/" +files[i];
    double** training_vars = new double*;
    training_vars = readFromFile(file);
    delete[] &training_vars;
}

我让函数readFromFile决定数组的大小并返回这个数组。

我遇到的问题是,每次运行时,我得到一个bad_alloc错误。我也不能在main中设置二维数组的大小所以我不知道该怎么做才能正确地删除这个数组。有什么想法吗?

您的程序有未定义的行为,这一行无效:

delete[] &training_vars;

因为&training_vars不是由new []分配的(注意training_vars只是一个指向双精度对象的指针,没有别的)。

你可能希望readFromFile为你做分配,可能是通过返回一个智能指针,或者,更好的是,通过const引用传递一个vector<>给它。

理想情况下,总是使用std::vector<>并摆脱c风格的数组,它的设计是为了避免这种情况。


注意:

您的for循环有不必要的括号,可以用for-range循环替换:

for(auto& file : files)
{
  ...
}

您确实必须至少用适当的"RAII"对象包装这个库并使用现代c++。像这样的东西会更适合你。

for ( auto file : files )
{
    std::shared_ptr< double * > training_vars( readFromFile( file ) );
   // ... the rest of your code that uses training_vars
}

如前所述,delete[] &training_vars;可能会隔离故障。您正在传递名为training_vars的堆栈本地"指针到指针到双精度"的地址以删除。您需要的是包含在该局部变量中的地址。