[英]Static pointer and operator new
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
更改其值。
此外,此代码有内存泄漏问题。 我可以用px1
delete
吗? 在两个指针上使用delete
会解决内存泄漏问题吗?
这是因为当控件首次通过初始化代码时,静态本地只被初始化一次。 因此,虽然您多次调用该函数以下行:
static X* px1 = new X(i);
只会在第一次调用中执行( i
为零),变量将在函数调用之间保持其值。
是的,您可以delete
px1
但最好将其设置为null,以避免双重自由和未定义的行为。 你也有px2
指向的对象的泄漏 - 你也必须处理这些对象。
但我不太明白为什么静态指针px1不能使用operator new更改其值
静态本地化在它们第一次被调用时被初始化,并且仅在第一次被初始化
在两个指针上使用delete会解决内存泄漏问题吗?
是
作为一种更好的做法,你应该使用std::unique_ptr
而不是原始指针并在这种情况下delete
。 它会自动为您执行delete
,因此您不会泄漏。
此外,您的分配都不需要在堆上进行分配。 通常,如果您希望对象在其创建的范围之外持久存在,则只使用new
。在这种情况下,您不需要它,因此您只需编写:
static X x1(i);
X x2(i);
cout<<x1.num;
cout<<x2.num<<' ';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.