2016-11-15 6 views
0

Есть ли что-то похожее на деструктор, но для namespace? У меня есть несколько пространств имен, каждая из которых имеет определенную функциональность, а некоторые имеют свои собственные переменные внутри. Я понимаю, что определение этих переменных как static ограничит их область применения конкретным использованием пространства имен, например. вызывая NamespaceA::function(), но будут ли они уничтожены (удалены, очищены и т. д.) каким-то образом, когда я позвоню NamespaceB::function()?Destructor-like для пространства имен

Как, я называю NamespaceA::function() и NamespaceA::vector привыкает, то мне нужно позвонить NamespaceB::function(), и его NamespaceB::vector привыкает. Теперь у меня есть два вектора, занимающих память, когда мне нужен только один, для текущего пространства имен. Есть ли способ, который я могу автоматически очистить неиспользуемые переменные, похожие на то, что деструктор делает в классе? Обратите внимание, что вызов пространств имен по прихоти пользователя, неизвестно, какой класс вызван, и когда.

Причина, по которой я хочу, это то, что могут быть векторы, которые я не хочу беспорядочно болтаться, едя память, даже если они не являются значениями данных GB.

+1

Не видя реального кода, что трудно сказать, но если у вас есть глобальные переменные, объявленные внутри пространства имен они так же, как регулярные глобальные переменные, кроме имени, имеют область действия. – NathanOliver

+0

@NathanOliver Thta - плохая новость. Я понимаю, что использование глобальных переменных не является хорошей практикой, поэтому я бы хотел этого избежать. Но, ради ответа, существуют ли пространства имен как деструктор или какой-то вид? –

+1

Пространства имен - это чисто синтаксические конструкции, используемые для организации вашего кода. Пространства имен не «построены» во время выполнения и поэтому не могут иметь деструктор или что-либо подобное ему. Переменные, объявленные в пространстве имен, являются статическими переменными, которые видны только в пределах данной области. –

ответ

1

Нет, в C++ нет такой языковой конструкции, как широкий деструктор namespace.

Опция у вас есть использовать специальные функции в вашем namespace, которые используются для инициализации и освобождения оккупированных ресурсов проводятся как глобальные переменные в namespace явно:

namespace Mine { 
    A* someGlobalResource = nullptr; 

    void init() { 
     someGlobalResource = new A(); 
    } 
    void freeResources() { 
     delete someGlobalResource; 
     someGlobalResource = nullptr; 
    } 
} 

int main() { 
    Mine::init(); 

    // Do works 

    Mine::freeResources(); 
} 

Другим решением является, конечно, создайте в своем пространстве имен вспомогательный класс и скройте эти вызовы функций в конструкторе/деструкторе:

Заголовок:

namespace Mine { 
    class MyNameSpace { 
    public: 
     MyNameSpace(); 
     ~MyNameSpace(); 
    private: 
     static std::atomic<bool> initialized = false; 
    }; 
} 

ЕП:

namespace { // Hide the functions in an anonymous namespace 
    void init() { 
     someGlobalResource = new A(); 
    } 
    void freeResources() { 
     delete someGlobalResource; 
     someGlobalResource = nullptr; 
    } 

    A* someGlobalResource = nullptr; 
} 

namespace Mine { 
    MyNameSpace::MyNameSpace() { 
     if(!initialized) { 
      MyNameSpace::init(); 
     } 
    } 
    MyNameSpace::~MyNameSpace() { 
     freeResources(); 
    } 
} 

и использовать его как

int main() { 
    Mine::MyNameSpace initHelper; 

    // Do works 
} // initHelper's destructor is called here 
+0

Это приятное решение, но если я отправлюсь туда, я думаю, что я просто сделаю класс и позволю деструктору работать для меня (или пользователя). –

+0

@aconcernedcitizen Я немного расспросил об этом. Обычно я бы не рекомендовал использовать глобальные ресурсы (пространство имен или нет) в проектах. –

+0

Этого я тоже хочу избежать. Я думал, что использование 'static' будет ограничивать управление, но NathanOliver прояснил это. Таким образом, это либо класс для каждого, либо класс интерфейса, который будет иметь все необходимые переменные, но переменные будут использоваться только один раз за вызов. –

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