2014-03-26 76 views
2

我存储的文本文件列表的载体内,并且要读取的文本文件的内容到每个迭代的二维数组:删除2维数组

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

+7

这太可怕了。请使用载体。 –

+0

@LightnessRacesinOrbit我不能使用矢量,我正在使用的函数/库需要双数组。我可以使用矢量,然后将其转换为双精度。 – Phorce

+0

使用不同的库或存储矢量,但在最后一分钟将指针传递给矢量数据。一个图书馆对所有这些手工记忆的诡计都没有任何借口,特别是深入的两个指针。 –

回答

2

程序具有不确定的行为,这条线是无效的:

delete[] &training_vars; 

因为&training_vars不是由new []分配(注意:training_vars仅仅是一个指向双,仅此而已)。

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

理想情况下,总是使用std::vector<>并摆脱C风格的阵列,它的目的是为了避免这样的情况。


注:

for循环有不必要的括号,并且可以通过一个用于范围循环替换:

for(auto& file : files) 
{ 
    ... 
} 
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;可能会seg错误。您将堆栈本地地址“指向指针的指针”传递给名为training_vars的double来删除。你想要的是包含在该局部变量中的地址。

+1

当指针不共享时,为什么要使用'std :: shared_ptr'? –

+1

我们不知道'// ...你使用training_vars的其他代码是怎么回事。它可能最终分享。根据发生的情况,unique_ptr可能更合适。 –