我有一个函数 foo 像
myType** foo(){
myType **array = malloc( .... );
//Do some stuff
return array;
}
在这里我已经 malloced 了,但在我归还它时没有释放它。这会导致内存泄漏吗?使用后是否应该在调用函数中显式释放它?
我有一个函数 foo 像
myType** foo(){
myType **array = malloc( .... );
//Do some stuff
return array;
}
在这里我已经 malloced 了,但在我归还它时没有释放它。这会导致内存泄漏吗?使用后是否应该在调用函数中显式释放它?
仅当您不释放内存(无论在哪里)时,这才是内存泄漏。
在这种情况下,您应该free
在调用函数并完成指针之后使用它。
但这是 C 的做法。在 C++ 中,您将返回一个智能指针,并使用new
而不是malloc
.
使用这种类型的函数,调用者是指针指向的资源的“所有者”。所以调用者必须要么释放资源,要么将它们传递给其他愿意的人。
在 C++ 中,人们倾向于返回一种管理其自己的资源的类型,例如一个std::vector
或一个智能指针,它们既负责资源解除分配,又使所有权明确。
看这个例子,别担心,阅读所有关于复制省略的内容,特别是命名返回值优化(NRVO)。
std::vector<std::vector<SomeType>> foo()
{
std::vector<std::vector<SomeType>> tmp = ....;
// do some stuff
return tmp;
}
内存泄漏是由于没有释放内存造成的。只要内存在某个时候被释放,它就不会泄漏。但是,如果指针曾经“丢失”,或者如果某种依赖循环导致内存在不再有用后仍然存在的情况,那么此时您已经创建了泄漏。
通常在这种情况下,您会创建这样的模式:
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++ 使用new
and delete
,我们通常在构造函数/析构函数对中完成这类工作。
很长一段时间以来,我一直对此问题有疑问。我建议你阅读这个 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() ;
}
希望这个代码狙击手可以帮助你。