我有一堂这样的课:
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/