【发布时间】:2013-07-29 13:43:12
【问题描述】:
据我所知,对于这两个向量声明:
//TYPE 1
std::vector<cls> vec; //cls is user defined datatype(A class)
vector 的内存在栈上分配,vector 中内容的内存在堆上分配。
以下声明也是如此(如果我错了,请纠正我):
//TYPE 2
std::vector<cls*> vec; //cls is user defined datatype(A class)
现在,当类型 1 中的向量超出范围时,将为存储在其中的对象释放内存。
但是如果我插入如下元素(假设我有适当的重载构造函数)然后向量超出范围,那么类型 2 会发生什么:
vec.push_back(new cls(5));
我明确尝试调用 clear 但未调用析构函数。是否会自动释放内存并调用析构函数。如果没有,那么如何实现。
另外,如果我将向量声明为:为向量分配的内存以及内容在哪里:
std::vector<cls*> *vec = new std::vector<cls*>;
【问题讨论】:
-
"会自动释放内存并调用析构函数吗?" - 不。只有用于存储指针的内存。 “如何做到这一点?” - 明确释放它,使用智能指针或只使用第一种形式。它是一个容器,让它包含对象。
-
在 C++ 中,我们通常不使用术语堆栈,而是使用自动存储了解更多信息,请参阅:stackoverflow.com/questions/6500313/…
-
一般规则:不要在 std 集合中使用原始指针。它们不会被自动清理,因此您很容易遇到内存泄漏。改用 shared_ptr,它在 boost 中可用。