gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:03:00 28 4
gpt4 key购买 nike

我有这样一个类:

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

这是您问题的一个(工作,而不是解决其他人在评论中提到的问题)版本。它不会触发任何 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 时(即使是隐含的),你对其中之一负责

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

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com