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

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

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

德韦什

4

2 回答 2

3

这里的问题之一是关键字static在 C++ 中意味着很多不同的东西,具体取决于上下文。你偶然发现了其中两个。

如果声明了成员变量static,则意味着该类本身具有该变量的一份副本,该副本在所有实例之间共享。

如果函数中的局部变量是static,则表示该变量的值在函数调用之间保持不变。它总是指代内存中的相同位置,即使在调用之间(或在递归调用中)也是如此。对于这样的变量,初始化程序仅在第一次进入函数时执行。

所以,如果你试过这个:

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

new int()仅在您第一次调用该函数时才会调用对 a 的赋值。这是因为,当作为变量声明的一部分编写时,它是一个初始化器。但是,如果您这样做:

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

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

于 2013-10-30T13:51:17.443 回答
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";
}
于 2013-10-30T13:55:25.050 回答