C++静态类成员,谁清理乱七八糟的东西?

Eri*_*ric 9 c++ memory

我想知道我的代码的哪一部分将在不再需要时释放动态分配的静态类成员.请参阅以下代码:classPrinter在所有A对象之间共享,并在创建第一个类实例时A创建.只是为了确定:classPrinter退出程序时对象会自动被破坏,对吧?

class A {
static B* classPrinter;
}
Run Code Online (Sandbox Code Playgroud)

a.cpp

#include "a.h"
B A::classPrinter = new B();

A::A() { ...}
Run Code Online (Sandbox Code Playgroud)

sbi*_*sbi 20

只是为了确定:somePrinter退出程序时对象会自动被破坏,对吧?

由于这是C++,答案是"不".对于分配new了相应的一切delete必须被调用.如果没有发生,则对象泄漏.但为什么要动态分配呢?这个

class A {
  static B classPrinter;
}

B A::classPrinter;
Run Code Online (Sandbox Code Playgroud)

表现得像你的代码,除了classPrinter在程序结束时将被破坏.

但是,你写的

classPrinter在所有A对象之间共享,并在创建第一个类实例时A创建.

您问题中的代码不会这样做.如果你想这样做,做这样的事情:

class A {
  static std::shared_ptr<B> classPrinter;
}

std::shared_ptr<B> A::classPrinter;

A::A()
{
  if(!classPrinter)
    classPrinter.reset(new B());
}
Run Code Online (Sandbox Code Playgroud)

智能指针将确保删除对象.


Mik*_*our 10

不,new永远不会自动删除使用的对象.您应始终提供匹配delete以防止内存泄漏.

在这种情况下,最简单的解决方案是拥有一个静态对象,而不是一个指向动态对象的静态指针 - 对于额外的间接级别没有任何理由.

// header file
class A {
    static B classPrinter;
};

// source file
B A::classPrinter;
Run Code Online (Sandbox Code Playgroud)

或者如果你想延迟构造直到需要对象(如果其他翻译单元中的静态对象需要从构造函数访问它,则避免潜在的问题):

class A {
    static B & classPrinter() {
        static B instance;
        return instance;
    }
};
Run Code Online (Sandbox Code Playgroud)

在其他情况下,当您实际需要动态分配时,应始终使用智能指针或其他RAII对象管理动态对象.