1.1)在使用std::vector、QVector、boost::array时是否存在内存泄漏的可能(不太明白它们在内存使用上的区别以及各自的优势是什么)?或者他们将内存作为智能指针?
1.2) 还是通过 shared_ptr 创建它们更好?
2) shared_aray 或 shared_ptr + vector 哪个更好?
1.1)在使用std::vector、QVector、boost::array时是否存在内存泄漏的可能(不太明白它们在内存使用上的区别以及各自的优势是什么)?或者他们将内存作为智能指针?
1.2) 还是通过 shared_ptr 创建它们更好?
2) shared_aray 或 shared_ptr + vector 哪个更好?
在它们管理的内存中,这三个中的任何一个都没有内存泄漏的可能性。也就是说,存储在 a 或 中的数据std::vector
将QVector
在std::array
容器被销毁时正确释放。
另一方面,如果您以不安全的方式管理容器本身,您当然可以泄漏整个容器。例如,如果你做了类似的事情new std::vector<int>()
,后来泄露了new
给你的指针。请注意,很少有理由动态分配容器。
此外,如果您在容器中存储不安全的指针,您当然可以泄漏这些指针指向的内容。
至于您列出的容器之间的区别:
std::vector
拥有一个连续的内存数组,当它需要更多空间时,它能够动态增长。每个这样的增长都涉及分配更大的空间并将当前存储的元素移动到新空间中,然后释放旧空间。
QVector
是一种奇怪的野兽,有点类似于std::deque
。在内部,它的实现就好像它是一个指针向量。QVector<T>
也就是说,如果您认为等效于std::vector<std::unique_ptr<T>>
,对于T
大于指针,std::vector<T>
对于T
指针大小或更小,您将不会太远。
std::array
与上述两者的根本区别在于它不持有动态内存,不能动态增长。std::array<T, N>
只是一个非常薄的包装器T [N]
,给它一个类似容器的界面。
关于您的问题 2,每个问题都不同:ashared_array
一旦分配就不能增长,std::vector
可以。很少有理由存储std::vector
在智能指针(或任何指针)中,因为一开始就很少动态分配它。