我有一个像
这样的函数foomyType** foo(){
myType **array = malloc( .... );
//Do some stuff
return array;
}
我在这里已经使用了malloced,但是当我返回时它没有释放它。这会导致内存泄漏吗?我使用它后,是否应该在调用函数中明确释放它?
答案 0 :(得分:5)
使用这种类型的函数,调用者是指针指向的资源的“所有者”。因此,呼叫者必须释放资源,或者将其传递给其他人。
在C ++中,人们倾向于返回管理自己资源的类型,例如std::vector
或smart 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 ++使用new
和delete
,这种工作通常在构造函数/析构函数对中完成。
答案 3 :(得分:1)
我长期以来遇到过这个问题。我建议你阅读这个维基页面:
在您的情况下,您可以使用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() ;
}
希望这段代码狙击手可以帮助你。