我正在开发一个类来读取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的返回指针中得到正确的值,但我有点担心可能会有某些东西阴险的继续!
答案 0 :(得分:1)
向量内的向量是完全安全的。在这里:
(*audio_all_chans).push_back(dummy_vector);
你推回矢量的副本,而不是矢量本身。
答案 1 :(得分:1)
我知道这很可怕,但你做的方式很好。一个好的经验法则是查看声明中*
的数量,以及delete
多少项。所以你有一个指向动态分配向量的指针。好的,你需要删除它。
里面怎么样?好吧,该向量将指针保存到其他向量,然后我们将负责删除那些,但由于你只有那里的向量,它们将超出范围并被删除。