2013-04-12 1 views
0

Я хотел бы использовать следующую статическую функцию. Эта функция, в свою очередь, вычисляет входные данные, а std :: cout - результат. После того, как статическая функция вызывается и удаляется из стека, будет ли освобождена вся эта память, связанная с этим классом? Является ли это эквивалентом для того, чтобы сделать экземпляр этого класса в рамках основного, или он будет существовать только во время вызова этой функции? Предположим, что функция вызывается как она ниже в основной функции. Кроме того, дополнительные ссылки для чтения были бы замечательными.Статическая функция внутри класса, как будет обрабатываться память?

typedef std::vector< std::vector<int> > matrix;  
    class LCS 
     { 
      public: 
       static void getLCS(std::string,std::string); 
      private: 
       void compute_alignment(); 
       std::vector<std::string> f1,f2; 
       matrix cost,link; 
     }; 
int main(int argc, char* argv[]) 
{ 
    //check command line args 
    if(argc != 3){std::cout<<"usage: ./exe file1.txt file2.txt";exit(1);} 
    //compute 
    LCS::getLCS(argv[1],argv[2]); 
} 

ответ

1

Судя строго от вашего вопроса, то все переменные объявленных внутри getLCS умрет после того, как функция выполняется, если они объявлены в стеке (не голый new любого рода). Ничто другое не должно жить дальше этого. Вызов статической функции также не создает новый класс LCS: статические функции на классах ведут себя почти как свободные функции, за исключением того, что они могут иметь модификаторы доступа, размещенные на них для определения области внутри класса. Static data and methods operate independently of their classes unless you explicitly use and intermingle them in member functions.

EDIT:

Обратите внимание, что это относится к функциям ALL C++. Объекты и примитивы, которые сделаны в стеке, будут умирать/выходить из области действия, когда эта функция/область умирает. В качестве бонусной забавы вы можете даже создать scope, шлепая некоторые брекеты { /* ... */ } вокруг некоторого кода произвольно! Но обычно нет необходимости делать подобные вещи.

Удачи вам!

+0

Я вижу. Таким образом, если бы эта функция предназначалась для выделения памяти в стеке для частной переменной в LCS, она была бы освобождена после того, как функция выходит за рамки. Скажем, если я использовал f1.resize (20) в getLCS. –

+0

@JordanDillonChapian Да. Все объекты C++ очищаются, когда они выходят за рамки. Если вы создаете объект LCS в этой функции, он должен автоматически очищаться вместе с любыми выделенными вами векторами (эти объекты знают, как очистить себя, когда объекты выходят из области видимости). – 2013-04-12 02:35:19

+0

Обратите внимание, что статичность функции getLCS не имеет значения. Те же правила для локальных переменных применяются, даже если getLCS не были статическими. –