我将文本文件列表存储在矢量中,并希望每次迭代都将文本文件的内容读入二维数组:
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数组的大小,所以我为了正确删除数组而在这里做了什么。有什么想法吗?
答案 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的地址传递给您。你想要的是该局部变量中包含的地址。