据我所知,对于两个向量声明:
//TYPE 1
std::vector<cls> vec; //cls is user defined datatype(A class)
Run Code Online (Sandbox Code Playgroud)
向量的内存在堆栈上分配,向量中的内容的内存在堆上分配.
以下声明也是如此(如果我错了,请纠正我):
//TYPE 2
std::vector<cls*> vec; //cls is user defined datatype(A class)
Run Code Online (Sandbox Code Playgroud)
现在,当Type 1中的向量超出范围时,将为存储在其中的对象释放内存.
但是如果我插入如下的元素(假设我有正确的重载构造函数)然后向量超出范围,那么在类型2中会发生什么:
vec.push_back(new cls(5));
Run Code Online (Sandbox Code Playgroud)
我明确地尝试调用clear但是没有调用析构函数.是否会自动释放内存并调用析构函数.如果不是那么如何实现.
此外,如果我将vector声明为vector,那么为向量分配的内存以及内容:
std::vector<cls*> *vec = new std::vector<cls*>;
Run Code Online (Sandbox Code Playgroud)
这就是为什么我们有智能指针.
{
std::vector<std::unique_ptr<cls>> vec;
// C++14 will allow std::make_unique
vec.emplace_back(std::unique_ptr<cls>(new cls(5)));
}
Run Code Online (Sandbox Code Playgroud)
当向量超出范围时,unique_ptr将调用s 的析构函数并释放内存.
在您的情况下,使用原始指针,您必须手动delete创建任何内容new:
// Something along the lines of this.
for (auto&& elem : vec) {
delete elem;
}
Run Code Online (Sandbox Code Playgroud)
此外,如果我将vector声明为vector,那么为向量分配的内存以及内容:
你正在分配矢量new,所以它将在堆上.