我有以下问题:
如果我在方法中使用malloc
,return
指向我main
的指针,以及{main}中指针free
,我是否已成功释放内存或不?这是不好的编程风格,如果我这样做的话?
int* mallocTest(int size)
{
int * array = (int*) malloc(size);
return array;
}
int main ()
{
int* pArray = mallocTest(5);
free (pArray);
return 0;
}
编辑:这个问题的主要目的是,我想知道,如果我成功释放了内存(如果我使用正确的“组合”malloc-free / new [] - 删除[])当我拆分这个进入方法和主要功能!
EDIT2:更改了代码和主题,以达到问题的预期目的
答案 0 :(得分:4)
没有。在阵列上使用free
时,使用malloc
释放分配了delete
,new
的内存,用于delete []
和new
的单个对象分配。
混合和匹配似乎有效(它是未定义的行为,“undefined”包含“工作正常”和“大部分时间都有效,但是在星期四的星期几崩溃,从M开始,可以整除的日子3或7,操作员有衬衫条纹“) - 可能确实适用于某些类型的系统,但在其他系统上失败,具体取决于malloc
和new
及其各自free
的确切方式}和delete
函数已实现。
调用一个返回指向某个内存的指针的函数是很好的,该指针稍后会通过适当的调用释放。如果你实际实现了一对函数,那就是“更好”,其中一个函数分配,另一个函数破坏数据。如果分配的数据结构不是微不足道(例如,您在外部分配中有分配),这一点尤为重要。
还要考虑如果你决定“哦,我想在new int[size];
”中使用malloc(size * sizeof(int));
而不是mallocTest()
会发生什么。现在,每个调用mallocTest()
的地方都必须进行更改,以便在阅读此答案后调整delete []
而不是free
。
[刚发现您的代码已损坏,可能无法编译,肯定不会分配空间:(int *)malloc[size];
没有按照您的意愿执行,我很确定是非法的,因为索引函数无效]
最后,“最佳”解决方案是将所有分配包装在一个对象中,这样该对象的析构函数就会破坏对象中分配的数据。因此,例如,使用std::vector<int>
而不是使用malloc
进行分配。
答案 1 :(得分:4)
在其他答案中解释了将malloc
与delete
混合的问题。
我觉得你想知道方法中是否分配malloc
内存,将指针返回main
,而free
主中的指针是否有效?是的,它可以完成,free
将清除在其他方法中分配的内存,前提是指针指向该位置。
答案 2 :(得分:2)
不 - 那是未定义的bahaviour,这意味着它可能看起来有效,但实际上却没有,对于malloc()
,你应该总是使用free()
。仅对delete[]
分配的内存使用new[]
。
您实际上可以自行检查,new[]
调用void* operator new(size_t)
方法,该方法应该在您的平台标头中声明。最简单的方法就是监视它与调试器的关系,在VS2005下它调用最终的HeapAlloc
函数。
对于释放,你有void operator delete[](void*)
,也必须在somwhere定义。在VS2005上,它调用HeapFree
。
我查看了malloc /免费通话,这些也是HeapAlloc
和HeapFree
。
所以在我的情况下看起来它会起作用,因为malloc
看起来像new[]
一样实现。但重点是这里没有魔力,new[]
应与delete[]
,malloc()
与free()
配对,因为您永远不知道这些是如何在给定平台上实现的。
答案 3 :(得分:1)
答案 4 :(得分:0)
实际上,您应该free
使用malloc
,delete
使用new
,但对我来说,不是因为不确定性,它可能会炸核弹,调用鼻子恶魔或其他什么。 (或者简单地说,维护噩梦)malloc
和new
根本不做同样的事情。为了简化实际上有点复杂的事情:
malloc
分配一块内存。周期。new T
分配一个正确大小的内存块,用于存储T
类型的对象(可能通过malloc
),执行对象的构造函数。 相反:
delete ptr
执行ptr
指向的对象的析构函数,并释放相关的内存块。free(ptr)
释放大块内存。周期。对于不会崩溃的Universe,对构造函数的每次调用都必须匹配对析构函数的调用。这是语言的保证。 (以及C ++最大的优势之一)
这就是为什么每次拨打malloc
的电话必须与free
的来电相匹配,因为free
是为了撤消malloc
所做的事情。每次拨打new
的电话都必须与delete
的来电相匹配,因为delete
用来撤消new
所做的事情。