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