如果不是这意味着我必须通过删除所有局部变量来结束每个函数,如果我想防止100%的内存泄漏?
答案 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)
将自动删除在堆栈上分配的局部变量,即不使用内存分配函数或malloc
和new
等运算符。必须使用delete
删除所有其他变量,因为它们存储在堆上。
答案 3 :(得分:3)
必须删除使用malloc,realloc,new和new []动态分配的内存。这些都在堆内存中。其他人会自动解除分配。