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更改其值。

另外,此代码还有内存泄漏问题。我可以将deletepx1一起使用吗?在两个指针上都使用delete是否可以解决内存泄漏问题?

最佳答案

这是因为静态本地仅在控制第一次通过初始化代码时被初始化一次。因此,尽管您多次在以下行中调用该函数:

static X* px1 = new X(i);

只会在第一次调用时执行(i为零),并且变量将在函数调用之间保留其值。

是的,您可以delete px1,但最好事后将其设置为null,以避免双重释放和未定义的行为。 px2指向的对象也会泄漏-您也必须注意那些对象。

09-05 13:45