当函数结束时,它的局部变量是否已释放?

时间:2014-02-17 15:26:58

标签: c++ memory memory-leaks

如果不是这意味着我必须通过删除所有局部变量来结束每个函数,如果我想防止100%的内存泄漏?

4 个答案:

答案 0 :(得分:15)

所有对象都有相关的存储持续时间。存储持续时间描述了对象的存储保持多长时间。非引用的局部变量引入具有自动存储持续时间的对象,这意味着这些对象的存储在其范围的末尾自动销毁。

引用类型变量不引入对象,甚至可能不需要存储它们自己,但它们仍然具有存储持续时间(§3.7/ 3)。如果引用确实需要存储,它将根据引用的存储持续时间释放。

因此,任何类型的局部变量声明都不会泄漏。实际上,您不能delete具有自动存储持续时间的对象。这仅用于具有动态存储持续时间的对象,这些对象使用new分配。

答案 1 :(得分:6)

如果手动分配内存,则必须在需要时将其删除,

示例:

char* foo()
{
    char* manually_allocated_char  = new char(); // this will 'live' outside the function
    char  autamically_allocated    = 'a'; // this will be 'deleted'
    return manually_allocated_char;
}


void main()
{
    char* a_new_char = foo();
    delete a_new_char; // You must free memory you have allocated for not having memory leaks
}

答案 2 :(得分:5)

将自动删除在堆栈上分配的局部变量,即不使用内存分配函数或mallocnew等运算符。必须使用delete删除所有其他变量,因为它们存储在堆上。

答案 3 :(得分:3)

必须删除使用malloc,realloc,new和new []动态分配的内存。这些都在堆内存中。其他人会自动解除分配。