现在我实现了一个类,我需要使用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?
}
我的问题是我是否需要调用向量的析构函数?提前致谢。非常感谢您的帮助。
答案 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) 对象超出范围),影响对象状态和程序 可能会崩溃。请参阅live demo
清除已分配的内存是一种很好的建议做法。但既然它是一个 全局对象,程序即将终止,即使你没有 可用内存,它会在进程终止时回收。
std::unique_ptr<>
在std::vector
中存储指针
以便在clear
方法中释放内存
在std::vector
上调用。这样您就不必迭代并手动调用Release
的每个成员的std::vector
方法