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<<' ';