class X {
public:
X(int i) : num(i){}
int num;
};
void f(int i){
static X* px1 = new X(i);
X* px2 = new X(i);
cout<<px1->num;
cout<<px2->num<<' ';
};
void main(){
for (int i=0;i<5;i++)
f(i);
}
该代码将输出
00 01 02 03 04
,但是我不太明白为什么静态指针px1
无法使用operator new
更改其值。另外,此代码还有内存泄漏问题。我可以将
delete
与px1
一起使用吗?在两个指针上都使用delete
是否可以解决内存泄漏问题? 最佳答案
这是因为静态本地仅在控制第一次通过初始化代码时被初始化一次。因此,尽管您多次在以下行中调用该函数:
static X* px1 = new X(i);
只会在第一次调用时执行(
i
为零),并且变量将在函数调用之间保留其值。是的,您可以
delete
px1
,但最好事后将其设置为null,以避免双重释放和未定义的行为。 px2
指向的对象也会泄漏-您也必须注意那些对象。