静态指针和操作符新

时间:2012-08-21 13:23:22

标签: c++

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

2 个答案:

答案 0 :(得分:11)

这是因为当控件首次通过初始化代码时,静态本地只被初始化一次。因此,虽然您将该函数多次调用以下行:

static X* px1 = new X(i);

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

是的,您可以delete px1,但最好将其设置为null,以避免双重自由和未定义的行为。您还有px2指向的对象泄漏 - 您也必须处理这些对象。

答案 1 :(得分:4)

  

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

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

时被初始化
  

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

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

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

static X x1(i);
X x2(i);
cout<<x1.num;
cout<<x2.num<<' ';