静态函数内的动态内存分配

时间:2013-10-30 13:36:25

标签: c++ memory-management static

如果我们在静态函数中分配动态内存,我想了解会发生什么?每次调用静态函数都会返回相同的内存,或者每次创建新内存时都会返回?

例如 -

    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";
    }

在此程序中,main()内的两个内存位置都不同。如果我们移动静态int * p;在allocate_memory()函数内部,如static int * p = new int;两个内存位置都会相同。

我想了解有什么区别。 static总是静态的,天气是在类内部还是在函数内部,那么为什么行为不同?

Devesh

2 个答案:

答案 0 :(得分: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;
}

然后,您会看到与其他情况相同的行为。

答案 1 :(得分:0)

每次调用allocate_memory时,都会创建一个新的int。 p是静态的,但它指向的东西会改变。

每次都返回指向同一对象的指针:

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

在main方法中,无论allocate_memory如何工作,p和q都会有所不同,因为它们是两个不同的指针。如果您取消引用p和q,您将比较它们指向的内容:

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