C ++ - 为类的成员变量释放dyncamically分配的内存会产生错误

时间:2014-07-16 07:28:39

标签: 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;

然后我填充值并进行操作。

现在我明白了,因为我只在堆栈上创建对象,所以我不需要删除它。 但我认为它会自动删除成员变量,包括类中的指针,但我必须明确freemalloc和{{1}使用data分配的内存}}

所以我把Class的析构函数写成

x

正如预期的那样,一旦Attributes::~Attributes() { if(data!=NULL) free(data); if(x!=NULL) free(x); } 的范围到期,就会调用析构函数。但在执行attr时出现此错误:

free

任何人都能解释一下我在做什么错误吗?

2 个答案:

答案 0 :(得分:1)

您可能正在某处复制attr

这是一个(工作,而不是解决其他人在评论中提到的问题)版本的问题。它不会触发任何doublefree错误:

#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(甚至是隐式)时,您要对

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

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

答案 1 :(得分:1)

只需使用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;
};