我有一个这样的课程:
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;
然后我填充值并进行操作。
现在我明白了,因为我只在堆栈上创建对象,所以我不需要删除它。
但我认为它会自动删除成员变量,包括类中的指针,但我必须明确free
为malloc
和{{1}使用data
分配的内存}}
所以我把Class的析构函数写成
x
正如预期的那样,一旦Attributes::~Attributes()
{
if(data!=NULL)
free(data);
if(x!=NULL)
free(x);
}
的范围到期,就会调用析构函数。但在执行attr
时出现此错误:
free
任何人都能解释一下我在做什么错误吗?
答案 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(甚至是隐式)时,您要对
负责您可以使用智能指针库来处理您的特定问题。
答案 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;
};