在这种情况下,我是否需要调用vector的析构函数

时间:2015-01-15 11:15:00

标签: c++

现在我实现了一个类,我需要使用vector来保存一些指针。这是一个全局成员。     vector g_vIPControlCollection;

系统完成时。我想收回记忆。然后我定义了destroy方法。

void Destroy()
{
    int size = g_vIPControlCollection.size();
    if (size > 1)
    {
        for (int i = 0; i < size; i++)
        {
            g_vIPControlCollection[i]->Release();
        }
    }
    g_vIPControlCollection.clear();
    g_vIPControlCollection.~vector<IPersistorControl*>(); //Does this line is necessary?
}

我的问题是我是否需要调用向量的析构函数?提前致谢。非常感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

没有

如果您这样做,在致电Destroy后,它将处于无效状态。当它的主人被摧毁时它会自毁。

你的Destroy函数也应该是析构函数。

答案 1 :(得分:2)

不,你不应该,你应该做的是使用unique_ptr来管理你的IPersistorControl个对象,例如:

#include <iostream>
#include <vector>
#include <memory>
using namespace std;

struct Point{
    int x; int y;
    Point(int x,int y): x(x), y(y){}
    ~Point(){ cout<< "destroying " << y<<endl;}
};

int main() {
    {
        vector<unique_ptr<Point>> ps;
        ps.emplace_back(unique_ptr<Point>(new Point(1,2)));
        ps.emplace_back(unique_ptr<Point>(new Point(1,3)));
        ps.emplace_back(unique_ptr<Point>(new Point(1,4)));
    } // will call dtors here
    cout << "Example 1" <<endl;
    {
        vector<unique_ptr<Point>> ps;
        ps.emplace_back(unique_ptr<Point>(new Point(1,2)));
        ps.emplace_back(unique_ptr<Point>(new Point(1,3)));
        ps.emplace_back(unique_ptr<Point>(new Point(1,4)));
        ps.clear(); // will call them here
        cout << "Example 2" <<endl; 
    }

    return 0;
}

注意,如果IPersistorControl是一个需要特殊类型的对象,需要一些其他“回收”方法(例如窗口句柄或文件句柄),你可以指定一个删除器,例如:

unique_ptr<FILE, int(*)(FILE*)> filePtr(fopen("LALA.txt", "wb"), fclose);
                     ^                                            ^
                    Deleter type                              the actual Deleter   

答案 2 :(得分:1)

不,你几乎不应该打电话给destructor explicitly

您需要做的只是g_vIPControlCollection.clear();您已经在做的事情。在此std::vector之后,几乎没有任何内存(通常是32位机器上的12个字节),并且在程序结束时将被清除。

答案 3 :(得分:0)

  1. 没有。您不应该也不需要手动调用析构函数。那会 导致析构函数调用两次次(1和1) 对象超出范围),影响对象状态和程序 可能会崩溃。请参阅live demo

  2. 清除已分配的内存是一种很好的建议做法。但既然它是一个 全局对象,程序即将终止,即使你没有 可用内存,它会在进程终止时回收。

  3. 尝试使用std::unique_ptr<>std::vector中存储指针 以便在clear方法中释放内存 在std::vector上调用。这样您就不必迭代并手动调用Release的每个成员的std::vector方法