C++ 静态指针和运算符new X类{ 公众: X(inti):num(i){} int-num; }; 无效f(内部i){ 静态X*px1=新的X(i); X*px2=新的X(i); cout
这是因为当控件第一次通过初始化代码时,静态局部变量只初始化一次。因此,尽管您多次调用该函数,但以下代码行:C++ 静态指针和运算符new X类{ 公众: X(inti):num(i){} int-num; }; 无效f(内部i){ 静态X*px1=新的X(i); X*px2=新的X(i); cout,c++,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<<' ';
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);
}
将仅在第一次调用中执行(i
为零),并且变量将在函数调用之间保持其值
是的,您可以delete
px1
,但最好在之后将其设置为null,以避免双重释放和未定义的行为。您还存在px2
指向的对象的泄漏-您也必须注意这些对象
但是我不太明白为什么静态指针px1不能改变它的
使用运算符new的值
静态局部变量在第一次调用时初始化,并且仅在第一次调用时初始化
在两个指针上使用delete是否可以解决内存泄漏问题
对
作为一种更好的做法,您应该使用std::unique_ptr
而不是原始指针,在这种情况下使用delete
。它会自动为您执行delete
,这样您就不会泄漏
此外,两个分配都不需要在堆上进行分配。通常,如果希望对象在创建对象的范围之外持久化,则只需使用new
。在这种情况下,您不需要这样做,只需编写:
static X* px1 = new X(i);
静态xx1(i);
X x2(i);
不能使用new
将以更少的代码解决内存泄漏问题。需要注意的是,如果在f()
末尾删除px1
,px1将被声明为静态。下次调用f()
时,px1
将是一个悬空指针。要解决此问题,需要将px1=new X(i)
在声明px1
的另一行。您可以使用删除px1
,但这不是正确的问题。真正的问题是,“我应该何时调用删除px1
”。没有好时机。@R.MartinhoFernandes如前所述,没有内存泄漏问题。不管他调用函数的频率有多高,只有一个分配。(不使用动态分配可能是更好的解决方案,但它确实引入了代码所没有的析构函数顺序问题。)@JamesKanze函数中的第二行在每次调用函数时分配一个新对象。作为更好的实践,您应该只使用static X px1(i);
Ya没有理由new
ing任何东西。我想我会添加它。将X*x2(i);
替换为X x2(i);
:-)@Dave不使用new
的原因可能被认为是不明确的。使用static
的原因是,变量将在函数调用之间保持不变;即,超出作用域的末尾。@Dave Duncial可能不是正确的词,但在这种情况下,有一个明确的愿望生命周期将延伸到范围之外,我担心一个不知情的程序员可能会将您关于new
的声明解释为这意味着它在这里是合适的。
static X x1(i);
X x2(i);
cout<<x1.num;
cout<<x2.num<<' ';