【问题标题】:Memory deallocation in linux c++?linux c++中的内存释放?
【发布时间】:2012-04-23 08:15:40
【问题描述】:

在我的应用程序中,我使用 malloc() 为我的变量 (unsigned char*) 分配了内存,当尝试在析构函数中释放该内存时,我使用此条件来避免双重损坏。

unsigned char *wsqData;
wsqData= (unsigned  char *)malloc( 10000*sizeof( unsigned char));

在我的析构函数中

  if(wsqData!=NULL)
  {
      free(wsqData);
      wsqData=NULL;
  } 

现在的问题是,当我在析构函数之前释放内存时,这个“if 条件”无法正常工作,它再次尝试释放该变量,导致双重损坏错误。这个场景有什么问题?

【问题讨论】:

  • 为什么在所谓的 C++ 程序中使用 C 内存管理?
  • 如果您尝试两次释放某些内容,那么您的代码中有错误。你还没有展示你的代码,所以很难建议......
  • 为什么要释放不同位置的内存?

标签: c++ linux memory malloc free


【解决方案1】:

在内存上调用free 不会自动将您的指针设置为NULL,因此您的条件毫无意义。您需要将wsqData 设置为NULL,无论您在哪里释放它。

当然这个条件无论如何都是没有意义的,因为在NULL指针上调用free保证是安全的。

【讨论】:

    【解决方案2】:

    您需要在释放析构函数之外的内存时将wsqData 设置为NULL。但在 C++ 中,您应该使用 newdelete。并尽量避免在析构函数之外的任何地方释放内存。

    【讨论】:

      【解决方案3】:

      正如其他人所说,您还需要在每次释放它时设置为 NULL。使其成为一个函数 - 释放 var 然后将其设置为 NULL,并从析构函数和程序中的任何位置调用它。

      【讨论】:

        【解决方案4】:

        仅供参考:这是dangling pointer 的经典示例。您需要按照建议将wsqData 设置为NULL

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-18
          • 2016-09-07
          • 1970-01-01
          • 1970-01-01
          • 2012-08-13
          • 1970-01-01
          • 2014-07-04
          • 1970-01-01
          相关资源
          最近更新 更多