C++ 我的向量向量内存安全吗?

C++ 我的向量向量内存安全吗?,c++,audio,C++,Audio,我正在开发一个类来读取WAV文件。该类应该为每个通道(左/右)生成一个向量,通道向量在它们自己的向量中 我已将类中的加载方法定义为: std::vector<std::vector<double> >* wavloader::load() throw(load_failed) std::vector*wavloader::load()抛出(加载失败) 因此,返回指向此向量向量的指针 在类中,我为顶级向量分配了内存,然后为任意多个通道创建了向量,如下所示: std::v

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

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

std::vector<std::vector<double> >* wavloader::load() throw(load_failed)
std::vector*wavloader::load()抛出(加载失败)
因此,返回指向此向量向量的指针

在类中,我为顶级向量分配了内存,然后为任意多个通道创建了向量,如下所示:

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);
std::vector*audio\u all\u chans=new std::vector;
std::矢量虚拟_矢量;

对于(int chan_index=0;chan_index向量,向量中的向量是完全安全的。在这里:

(*audio_all_chans).push_back(dummy_vector);

你推回一个向量的副本,而不是向量本身。

我知道这很可怕,但你这样做的方式很好。一个好的经验法则是查看声明中
*
的数量,然后
删除
那么多项。因此,你有一个指向动态分配向量的指针。很好,你需要删除它


那么内部呢?这个向量包含指向其他向量的指针,那么我们将负责清除这些向量,但是因为这里只有向量,它们将超出范围并被删除。

如果
valgrind
说所有堆内存都被正确释放,并且您的程序编译良好,那么为什么您认为有这样的情况这将是“随机覆盖”?为什么要动态分配一个向量,然后返回指向它的指针?为什么不简单地按值返回向量?顺便说一句,异常说明符已被弃用。@斯皮蒂:不,按值返回并不一定意味着复制。除非您在代码中做了一些非常疯狂的事情,否则RVO极有可能(返回值优化)将启动。如果没有启动,C++11编译器将强制执行结果而不是复制。此外,向量始终具有其实际数据(您推后的元素)
)在堆上,无论您如何分配vector对象,vector对象只包含两个指针。堆栈向量在堆栈上有两个指针,堆上有实际数据,而“heap vector”堆上有两个指针,实际数据也在堆上。向量的数据不可能在堆栈上,因此“嵌套向量”或“内部向量”将始终在堆上。它可能是“内存安全的”,但不是异常安全的。