2013-10-30 66 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"; 
}