我的载体向量是否记忆安全?

时间:2011-11-20 20:54:53

标签: c++ audio

我正在开发一个类来读取WAV文件。该类应为每个通道(左/右)生成一个向量,其中的通道向量位于它们自己的向量中。

我已经将类中的加载方法定义为:

std::vector<std::vector<double> >* wavloader::load() throw(load_failed)

因此返回一个指向这个向量矢量的指针。

在课堂内我已经为顶级矢量分配了内存,然后根据需要为多个频道创建了矢量,如下所示:

std::vector<std::vector<double> >* audio_all_chans = new std::vector<std::vector<double> >;

std::vector<double> dummy_vector;

for(int chan_index = 0; chan_index<n_channels; chan_index++)
(*audio_all_chans).push_back(dummy_vector);

然后我浏览文件,并用适当的样本填充每个向量。

虽然使用new分配了顶层“向量矢量”,但我担心各个“通道”向量(使用dummy_vector生成)的方式是在堆栈上分配的。

当我离开课程时,包含的向量是否超出范围并且可能被覆盖?

程序完全没有警告编译,valgrind完全满意它,我仍然从类delete d的返回指针中得到正确的值,但我有点担心可能会有某些东西阴险的继续!

2 个答案:

答案 0 :(得分:1)

向量内的向量是完全安全的。在这里:

(*audio_all_chans).push_back(dummy_vector);

你推回矢量的副本,而不是矢量本身。

答案 1 :(得分:1)

我知道这很可怕,但你做的方式很好。一个好的经验法则是查看声明中*的数量,以及delete多少项。所以你有一个指向动态分配向量的指针。好的,你需要删除它。

里面怎么样?好吧,该向量将指针保存到其他向量,然后我们将负责删除那些,但由于你只有那里的向量,它们将超出范围并被删除。