从函数返回malloced指针,是否会导致内存泄漏?

时间:2012-09-25 06:20:19

标签: c++ pointers memory-management memory-leaks malloc

我有一个像

这样的函数foo
myType** foo(){

    myType **array = malloc( .... );
    //Do some stuff
    return array;
}

我在这里已经使用了malloced,但是当我返回时它没有释放它。这会导致内存泄漏吗?我使用它后,是否应该在调用函数中明确释放它?

4 个答案:

答案 0 :(得分:5)

使用这种类型的函数,调用者是指针指向的资源的“所有者”。因此,呼叫者必须释放资源,或者将其传递给其他人。

在C ++中,人们倾向于返回管理自己资源的类型,例如std::vectorsmart pointer,它们都负责资源取消分配并使所有权变得清晰。< / p>

请参阅此示例,不要担心,请阅读有关copy elision的所有内容,尤其是命名的返回值优化(NRVO)。

std::vector<std::vector<SomeType>> foo()
{
  std::vector<std::vector<SomeType>> tmp = ....;
  // do some stuff
  return tmp;
}

答案 1 :(得分:4)

只有在你没有释放内存时才会发生内存泄漏(无论在哪里)。

在这种情况下,在调用函数并完成指针后,你应该free

但这是C方式。在C ++中,您将返回智能指针,并使用new代替malloc

答案 2 :(得分:2)

内存泄漏是由于没有释放内存造成的。只要内存在某个时刻释放,那么它就不会泄露。但是如果指针变得“丢失”或者某种依赖循环导致内存保持不变的情况,即使它不再有用,那么此时你就已经创建了泄漏。

通常在这种情况下,您可以创建如下模式:

void* mything_init() {
   void *obj = malloc(LEN);
   // do some initialization
   return obj;
}

void mything_uninit(void* thing) {
   // any teardown
   free(thing);
}

对于mything的每个_init,您最终必须在该对象上调用_uninit。这是您作为该库用户的责任。作为该库的编写者,您确保在_init中分配的任何内容都可以在_uninit中正确释放。

这是C模式而不是C ++模式,因为malloc()是C语言。 C ++使用newdelete,这种工作通常在构造函数/析构函数对中完成。

答案 3 :(得分:1)

我长期以来遇到过这个问题。我建议你阅读这个维基页面:

Smart Pointers

在您的情况下,您可以使用unique_ptr。因此,您可以将指针的所有权转移给调用者函数。

unique_ptr<int> callee1()
{
     std::unique_ptr<int> p1(new int(5));
     return p1;
}

int main()
{
     std::unique_ptr<int> result = callee1() ;
     (*result)++; // Increase the value stored in the pointer
     std::cout << "New Value: " << (*result) << std::endl; 
     result.reset() ;
}

希望这段代码狙击手可以帮助你。