为类的成员变量释放动态分配的内存会产生错误

C++- freeing dyncamically allocated memory for a member variable of a class gives error

本文关键字:内存 错误 释放 成员 变量 动态分配      更新时间:2023-10-16

我有一个这样的类:

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

在main函数的某个地方,我创建了这个:

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;

然后填充值并执行操作。

现在我明白了,因为我只在堆栈上创建对象,所以我不需要删除它。但是我认为它只会自动删除成员变量,包括类中的指针,但我必须显式地freedatax使用malloc分配的内存

所以我把类的析构函数写成
Attributes::~Attributes()
{
if(data!=NULL)
    free(data);
if(x!=NULL)
    free(x);
}

如预期的那样,一旦attr的作用域过期,就调用析构函数。但是在执行free时,我得到这个错误:

*** Error in '~/Plot':double free or corruption (!prev): 0x0000000002a7e9d0 ***
谁能解释一下我犯的错误是什么?

您可能正在某个地方复制attr

这是你的问题的一个(工作,不修复其他人在评论中提到的问题)版本。它不会触发任何double - free错误:

#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)

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

使用std::vector,例如:

class Attributes
{
public:
    void resize(std::size_t size)
    {
       data.resize(size);
       x.resize(x);
    } 
private:
    std::vector<float> data;
    std::vector<float> x;
    float min_x;
    float max_x;
};