2

我有一个函数 foo 像

myType** foo(){

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

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

4

4 回答 4

5

仅当您不释放内存(无论在哪里)时,这才是内存泄漏。

在这种情况下,您应该free在调用函数并完成指针之后使用它。

但这是 C 的做法。在 C++ 中,您将返回一个智能指针,并使用new而不是malloc.

于 2012-09-25T06:21:34.317 回答
5

使用这种类型的函数,调用者是指针指向的资源的“所有者”。所以调用者必须要么释放资源,要么将它们传递给其他愿意的人。

在 C++ 中,人们倾向于返回一种管理其自己的资源的类型,例如一个std::vector或一个智能指针,它们既负责资源解除分配,又使所有权明确。

看这个例子,别担心,阅读所有关于复制省略的内容,特别是命名返回值优化(NRVO)。

std::vector<std::vector<SomeType>> foo()
{
  std::vector<std::vector<SomeType>> tmp = ....;
  // do some stuff
  return tmp;
}
于 2012-09-25T06:22:02.857 回答
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++ 使用newand delete,我们通常在构造函数/析构函数对中完成这类工作。

于 2012-09-25T06:32:26.660 回答
1

很长一段时间以来,我一直对此问题有疑问。我建议你阅读这个 wiki 页面:

智能指针

在您的情况下,您可以使用 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() ;
}

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

于 2013-10-31T20:27:14.373 回答