为类的成员变量释放动态分配的内存会产生错误
C++- freeing dyncamically allocated memory for a member variable of a class gives error
我有一个这样的类:
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;
然后填充值并执行操作。
现在我明白了,因为我只在堆栈上创建对象,所以我不需要删除它。但是我认为它只会自动删除成员变量,包括类中的指针,但我必须显式地free
为data
和x
使用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;
};
相关文章:
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- 为什么删除分配的阵列会导致内存错误?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 需要找到3个小错误-内存错误
- 从'deleted function'获取内存错误
- OpenGL, GLFW, GLAD. glViewport(0, 0, 800, 600) 抛出内存错误
- 销毁 std::queue 会导致内存错误
- 加速进程间:管理共享内存错误
- 删除映射中的指针会导致内存错误
- 由于从 std::map 派生的类中的 std::map 迭代器导致的内存错误
- 当我用clang编译代码时,GCOV会出现内存错误
- 查找素数和时出现内存错误
- 循环链表的内存错误:未分配正在释放的指针
- 为什么我会因Valgrind遇到内存错误?(C ,抽象语法树评估)
- 我如何解析包含65k行的代码的文件,导致[BCC32致命错误] F1008出于内存错误
- 动态内存错误
- 内存错误C 私有INT
- 无法在 Mac OS X 上分配内存错误 - java(xx,xx) malloc: *** mmap(size=XX)
- 类对象的可变级别内存错误检测