删除二维数组

时间:2014-03-26 20:16:49

标签: c++ arrays

我将文本文件列表存储在矢量中,并希望每次迭代都将文本文件的内容读入二维数组:

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错误。我无法在主要内部调整2D数组的大小,所以我为了正确删除数组而在这里做了什么。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

delete[] &training_vars;

由于&training_vars未分配new [](请注意training_vars只是指向双精度型的指针,仅此而已。)

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

理想情况下,总是使用std::vector<>并摆脱C风格的数组,它旨在避免这种情况。


注意:

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

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

答案 1 :(得分:0)

你真的必须至少用适当的“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的地址传递给您。你想要的是该局部变量中包含的地址。