2015-01-15 3 views
0

Теперь я реализую класс, и мне нужно использовать вектор для хранения некоторых указателей. Это глобальный член. вектор 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? 
} 

Вопрос в том, нужно ли мне называть деструктор вектора? Заранее спасибо. Ваша помощь будет принята с благодарностью.

ответ

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 некоторый объект, который необходим специальный типа, который требует какого-либо другой метода «апелляционная» (например, окна ручки или дескрипторов файлов) можно указать, например, Deleter:

unique_ptr<FILE, int(*)(FILE*)> filePtr(fopen("LALA.txt", "wb"), fclose); 
        ^          ^
        Deleter type        the actual Deleter 
0
  1. Нет. Вы не должны и не должны вызывать деструктор вручную. Это приведет к вызову деструктора два раз (1 от вас и 1, когда объект выходит из сферы действия), влияя на состояние объекта и вашу программу может привести к сбою в лучшем случае. См. live demo

  2. Рекомендуется использовать и очистить выделенную память. Но поскольку это глобальный объект , и программа будет завершена, даже если вы не освободите память , она будет восстановлена ​​по мере завершения процесса.

  3. Попробуйте использовать std::unique_ptr<> для хранения указателей в std::vector так, что память будет выпущен, когда метод clear в вызывается std::vector. Таким образом, вам не придется перебирать вручную вызвать метод Release каждого члена std::vector
+0

Поскольку релиз не деструктор объекта, и он используется только для уменьшения счетчика ссылок. Может ли смарт-указатель автоматически вызывать его, когда вектор очищает все члены? – Goleo8

+0

@ Goleo8 Нет. Это не так. Но если вам нужен объект подсчета ссылок, не был ли 'std :: shared_ptr <>' лучший выбор? Я имею в виду, кто когда-либо (клиент) получает объекты, должен получить его как 'std :: shared_ptr <>'. Для получения дополнительной информации http://stackoverflow.com/a/11824317/1180117 – Kiran

3

No.

Если вы сделали это, после того, как вызов Destroy он будет оставлен в нерабочем состоянии , Он разрушит сам себя, когда его владелец будет уничтожен.

И ваша функция Destroy также должна быть деструктором.

1

Нет, вы почти никогда не должны называть destructor explicitly.

Что вам нужно сделать, это просто g_vIPControlCollection.clear();, что вы уже делаете. После этого std::vector вряд ли сохранит память (как правило, 12 байт на 32-битных машинах) и будет очищен, когда программа закончится.

Смежные вопросы