【发布时间】:2014-07-16 07:28:39
【问题描述】:
我有这样的课:
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 用于data 和x 的内存
所以我把类的析构函数写成
Attributes::~Attributes()
{
if(data!=NULL)
free(data);
if(x!=NULL)
free(x);
}
正如预期的那样,一旦attr 的范围到期,就会调用析构函数。但在执行free 时出现此错误:
*** Error in '~/Plot':double free or corruption (!prev): 0x0000000002a7e9d0 ***
谁能解释我做错了什么?
【问题讨论】:
-
你为什么使用
malloc和free而不是new和delete? -
@EdChum 我想我可以在 C/C++ 中使用它。我不能吗?
-
BTW
free(NULL)有效,所以测试没用。 -
你不能,只是不应该:) malloc/free 是 c,new/delete 是 c++。两者在“现代”c++ 中都已被弃用,这意味着有更简单、更安全的方法来执行此操作,例如智能指针:
std::unique_ptr、std::shared_ptr、std::weak_ptr。 -
我怀疑你复制了
Attributes,而且你不遵守三法则。
标签: c++ class memory-management malloc free