C++-为类的成员变量释放动态分配的内存会出现错误

标签 c++ class memory-management malloc free

我有一堂这样的课:

Class Attributes
{
Public:
    float* data;
    float* x;
    float min_x;
    float max_x;
    ~Attributes();
};

在主函数中的某个时刻,我创建了这个:

Attributes attr;
float* data =(float*)malloc(N*sizeof(float));
float* x =(float*)malloc(N*sizeof(float));
/* populate values of data and x */

attr.data = data;
attr.x = x;

然后我填充值并执行我的操作。

现在我明白了,由于我仅在堆栈上创建对象,因此不需要删除它。 但我认为它只会自动删除成员变量,包括类内的指针,但我必须显式地释放为使用malloc分配的内存数据x

所以我将类的析构函数写为

Attributes::~Attributes()
{
if(data!=NULL)
    free(data);
if(x!=NULL)
    free(x);
}

正如预期的那样,一旦 attr 的范围到期,就会调用析构函数。但在执行 free 时,我收到此错误:

*** Error in '~/Plot':double free or corruption (!prev): 0x0000000002a7e9d0 ***

谁能解释一下我犯了什么错误?

最佳答案

您可能正在将 attr 复制到某处。

这是您问题的一个版本(有效,而不是解决其他人在评论中提到的问题)。它不会触发任何双重释放错误:

#include <cstdlib>

class Attributes
{
public:
    float* data;
    float* x;
    float min_x;
    float max_x;
    ~Attributes() {
      if(data!=NULL)
    free(data);
      if(x!=NULL)
    free(x);
    }
};

int main(int argc, char** argv) {
  int N = 100;
  Attributes attr;
  float* data =(float*)malloc(N*sizeof(float));
  float* x =(float*)malloc(N*sizeof(float));
  attr.data = data;
  attr.x = x;
}

要点是:当您复制 attr(即使是隐式)时,您有责任

  • 跟踪资源使用情况(两个对象引用同一内存)
  • 或者也复制分配的资源(即根据您的特定语义,您可以在(复制)构造函数中将指针设置为 NULL,或者在构造时分配一个新数组(这意味着您需要携带一个长度字段另外,说真的,你应该使用 std::vector)

您可以使用智能指针库来解决您的特定问题。

关于C++-为类的成员变量释放动态分配的内存会出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24774696/

相关文章:

c++ - 如何理解使用 typedef 定义函数指针?

c++ - 具有 boost 变体的静态多态性单访问者与多访问者与动态多态性

c++ - 在不使用基础的情况下从 C++ 获取包路径

Java,Spring,手动实例化Spring bean,获取 "FileNotFoundException: class path resource [WEB-INF/spring.properties] cannot be opened..."

c# - 接口(interface)内存分配

c++ - C++ 中成员的枚举成员,或替代

c# - 没有括号的方法链接,如何?

class - 在lua中支持 "recursive objects"

java - 生成签名 APK 时出现 Proguard 规则错误

具有指向同一位置的更多指针的 C 内存管理