1.1)使用std :: vector,QVector,boost :: array时是否存在内存泄漏的可能性(不太了解它们在内存使用方面的区别以及每种内容的优点)?或者他们将记忆作为智能指针?
1.2)或者通过shared_ptr创建它们会更好吗?
2)有什么更好的shared_aray或shared_ptr + vector?
答案 0 :(得分:2)
他们管理的内存中的三个中都不存在内存泄漏的可能性。也就是说,数据存储在std::vector
,QVector
或{{当容器被销毁时,1}}将被正确释放。
另一方面,如果您以不安全的方式管理容器本身,您当然可以泄漏整个容器。例如。如果您执行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>
的一个非常薄的包装器,为它提供了类似容器的界面。
关于您的问题2,每个问题都有所不同:T [N]
一旦分配shared_array
就无法增长,std::vector
即可。很少有理由将std::vector
存储在智能指针(或任何指针)中,因为首先动态分配它是很少见的。