在方法中使用malloc,主要工作免费吗?

时间:2014-02-20 09:21:30

标签: c++ malloc

我有以下问题:

如果我在方法中使用mallocreturn指向我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:更改了代码和主题,以达到问题的预期目的

5 个答案:

答案 0 :(得分:4)

没有。在阵列上使用free时,使用malloc释放分配了deletenew的内存,用于delete []new的单个对象分配。

混合和匹配似乎有效(它是未定义的行为,“undefined”包含“工作正常”和“大部分时间都有效,但是在星期四的星期几崩溃,从M开始,可以整除的日子3或7,操作员有衬衫条纹“) - 可能确实适用于某些类型的系统,但在其他系统上失败,具体取决于mallocnew及其各自free的确切方式}和delete函数已实现。

调用一个返回指向某个内存的指针的函数是很好的,该指针稍后会通过适当的调用释放。如果你实际实现了一对函数,那就是“更好”,其中一个函数分配,另一个函数破坏数据。如果分配的数据结构不是微不足道(例如,您在外部分配中有分配),这一点尤为重要。

还要考虑如果你决定“哦,我想在new int[size];”中使用malloc(size * sizeof(int));而不是mallocTest()会发生什么。现在,每个调用mallocTest()的地方都必须进行更改,以便在阅读此答案后调整delete []而不是free

[刚发现您的代码已损坏,可能无法编译,肯定不会分配空间:(int *)malloc[size];没有按照您的意愿执行,我很确定是非法的,因为索引函数无效]

最后,“最佳”解决方案是将所有分配包装在一个对象中,这样该对象的析构函数就会破坏对象中分配的数据。因此,例如,使用std::vector<int>而不是使用malloc进行分配。

答案 1 :(得分:4)

在其他答案中解释了将mallocdelete混合的问题。

我觉得你想知道方法中是否分配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 /免费通话,这些也是HeapAllocHeapFree

所以在我的情况下看起来它会起作用,因为malloc看起来像new[]一样实现。但重点是这里没有魔力,new[]应与delete[]malloc()free()配对,因为您永远不知道这些是如何在给定平台上实现的。

答案 3 :(得分:1)

  • 使用 malloc new 动态分配内存时, 为特定目的“保留”堆内存的一部分。 在将内存返回堆中之前,内存将保持“保留”状态 使用免费删除(取决于您用于分配的内容)。
  • 话虽这么说,你可以从程序中的任何地方分配内存 并且f * 来自任何地方 *。然而,重要的是要确定并做到 如果您忘记释放分配的内存,则会导致内存泄漏

答案 4 :(得分:0)

实际上,您应该free使用mallocdelete使用new,但对我来说,不是因为不确定性,它可能会炸核弹,调用鼻子恶魔或其他什么。 (或者简单地说,维护噩梦)mallocnew根本不做同样的事情。为了简化实际上有点复杂的事情:

    从C继承的
  • malloc分配一块内存。周期。
  • new T分配一个正确大小的内存块,用于存储T类型的对象(可能通过malloc),执行对象的构造函数。

相反:

  • delete ptr 执行ptr指向的对象的析构函数,并释放相关的内存块。
  • free(ptr)释放大块内存。周期。

对于不会崩溃的Universe,对构造函数的每次调用都必须匹配对析构函数的调用。这是语言的保证。 (以及C ++最大的优势之一)

这就是为什么每次拨打malloc的电话必须与free的来电相匹配,因为free是为了撤消malloc所做的事情。每次拨打new的电话都必须与delete的来电相匹配,因为delete用来撤消new所做的事情。