【问题标题】:c++ destruct staic variable in function with memory allocation带有内存分配的函数中的c ++结构静态变量
【发布时间】:2020-07-22 05:59:43
【问题描述】:

我对 c++ 有一点疑问

我怎样才能在没有内存泄漏的情况下销毁这段代码?

void classA::funcA()
{
    static char* cArr = new char[10];
}

就不要这样写吗?

【问题讨论】:

  • 真的没必要调用delete。是的,这是内存泄漏,因为您没有释放内存,但静态变量只初始化一次,这意味着您只调用一次new,并且变量在程序结束之前不会被销毁无论如何,所有内存都会返回给操作系统。
  • 或者使用智能指针来确保它是明确的deleteed。虽然,正如@NathanOliver 所提到的,在程序结束时它将是deleteded。
  • @Gupta 它没有得到deleted,如果你依赖析构函数实际做一些重要的事情,这可能是非平凡类型的问题。对于这种情况,OP 的问题会更加相关。
  • @walnut 你的意思是静态对象的 dtor 不会在程序结束时为非平凡类型调用?
  • @Gupta 调用了静态对象的析构函数,但我的意思是静态对象是指向分配有new 的非平凡可破坏对象的指针的情况,如OP 的示例所示。不会自动调用动态分配对象的析构函数。

标签: c++ memory-management memory-leaks static destructor


【解决方案1】:

您可以改用 RAII 类型或避免分配:

static char cArr[10];
static auto cArr2 = std::make_unique<char[]>(10);

【讨论】:

    【解决方案2】:

    静态存储中的对象在整个程序期间都存在。

    如果您在整个持续时间内不使用该对象,则可以在程序终止之前删除指向的动态对象。但如果是这样的话,那你为什么要通过静态存储中的指针来拥有对象呢?

    从技术上讲,当静态指针的生命周期结束时内存泄漏这一事实不是问题,因为程序即将结束。

    您首先应该重新考虑的是您是否需要静态存储。如果您确实将设计更改为使用自动存储,那么您必须非常小心,不要泄漏内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-27
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多