2013-10-30 70 views
1

我想了解會發生什麼,如果我們分配靜態函數內的動態內存?每次調用靜態函數都會返回相同的內存,或者每次創建新內存?動態內存分配裏面的靜態函數

對於示例 -

class sample 
    { 
      private: 
      static int *p; 
      public: 
      static int* allocate_memory() 
      { 
        p = new int(); 
        return p; 
      } 
    }; 

    int* sample::p=NULL; 

    int main() 
    { 
      int *p= sample::allocate_memory(); 
      int *q = sample::allocate_memory(); 
      cout << p << " " << q << endl; 
      if (p== q) 
        cout << "we are equal"; 
    } 

在該程序中主兩個存儲器位置()是不同的。如果我們移動static int * p;在allocate_memory()函數內部,像static int * p = new int;兩個內存位置都會一樣。

我想了解有什麼不同。靜態總是靜態的,天氣是內部類還是內部函數,那爲什麼行爲不同?

Devesh

回答

3

這裏的一個問題是,關鍵字static意味着大量的在C++中根據上下文不同的東西。你偶然發現了其中的兩個。

如果成員變量被聲明爲static,這意味着類本身有一個在所有實例之間共享的變量副本。

如果函數中的局部變量爲static,則表示該變量的值在函數調用之間持續存在。它始終指向內存中的相同位置,即使在調用之間(或遞歸調用)也是如此。對於這樣一個變量,初始化器僅在第一次輸入函數時才執行。

所以,如果你已經嘗試這樣的:

static int* allocate_memory() 
{ 
    static int p = new int(); 
    return p; 
} 

分配到new int()只會叫你第一次調用該函數。這是因爲,當作爲變量聲明的一部分編寫時,它是一個初始化程序。但是,如果您要這樣做:

static int* allocate_memory() 
{ 
    static int p; 
    p = new int(); 
    return p; 
} 

然後,您會看到與您的其他情況相同的行爲。

0

每次調用allocate_memory時,都會創建一個新的int。 p是靜態的,但它指向的內容將會改變。

的指針每次都返回相同的對象:

static int* allocate_memory() 
{ 
    if(!p) 
    { 
     p = new int(); 
    } 
    return p; 
} 

在你的主要方法,p和q會有所不同,無論作品如何allocate_memory,因爲它們是兩個不同的指針。如果您取消參考p和q,您將比較它們指向的內容:

if(*p == *q) 
{ 
    cout << "Equal"; 
}