2
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解决内存泄漏问题吗?

4

2 回答 2

12

这是因为当控制第一次通过初始化代码时,静态局部变量只被初始化一次。因此,尽管您在以下行多次调用该函数:

static X* px1 = new X(i);

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

是的,你可以,delete px1但你最好在之后将其设置为 null 以避免双重释放和未定义的行为。你也有指向的对象泄漏px2- 你也必须照顾这些对象。

于 2012-08-21T13:24:55.083 回答
4

但我不太明白为什么静态指针 px1 不能使用 operator new 改变它的值

静态局部变量在第一次被调用时被初始化,并且只在第一次被调用

在两个指针上使用 delete 会解决内存泄漏问题吗?

是的

作为一种更好的做法,在这种情况下,您应该使用std::unique_ptr原始指针而不是原始指针。delete它会delete自动为您完成,因此您不会泄漏。

此外,您的任何分配都不需要在堆上分配。通常,您仅new在希望对象在其创建的范围之外持续存在时才使用。在这种情况下,您不需要它,因此您可以编写:

static X x1(i);
X x2(i);
cout<<x1.num;
cout<<x2.num<<' ';
于 2012-08-21T13:26:50.183 回答