如何在矢量被破坏时解除分配内容?

Sak*_*ham 11 c++ stl

据我所知,对于两个向量声明:

//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)

Moh*_*oun 5

这就是为什么我们有智能指针.

{
    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,所以它将在堆上.