>我有一个函数foo like
myType** foo(){
myType **array = malloc( .... );
//Do some stuff
return array;
}
在这里,我已错误定位,但在我返回它时没有释放它.这会导致内存泄漏吗?使用后,我应该在调用函数中显式释放它吗?
仅当您不释放内存(无论在哪里)时,它才是内存泄漏。
在这种情况下,您应该在调用函数并完成指针后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);
}
对于您_init
的每个mything
,您最终必须在该对象上调用_uninit
。这是您作为该库用户的责任。作为该库的编写者,您可以确保在_init
中分配的任何内容都能在_uninit
中正确释放。
而不是一个C++模式,因为 malloc() 是一个 C 习惯用法。C++使用new
和delete
,而这种工作我们通常在构造函数/析构函数对中完成。
很长一段时间我都遇到了这个问题。我建议你阅读这个维基页面:
智能指针
在您的情况下,您可以使用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() ;
}
希望这个代码狙击手对你有所帮助。