如果我们在静态函数中分配动态内存,我想了解会发生什么?每次调用静态函数都会返回相同的内存,或者每次创建新内存时都会返回?
例如 -
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
答案 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";
}