【发布时间】:2014-03-16 23:26:27
【问题描述】:
如果不是,这是否意味着如果我想防止 100% 的内存泄漏,我必须通过删除所有局部变量来结束每个函数?
【问题讨论】:
-
了解本地作用域对于“获得”C++ 至关重要。寻找包含
scope和destructor字样的教程。
标签: c++ memory memory-leaks
如果不是,这是否意味着如果我想防止 100% 的内存泄漏,我必须通过删除所有局部变量来结束每个函数?
【问题讨论】:
scope 和 destructor 字样的教程。
标签: c++ memory memory-leaks
所有对象都有一个关联的存储期限。存储持续时间描述了对象的存储保留多长时间。非引用的局部变量会引入具有自动存储持续时间的对象,这意味着这些对象的存储在其作用域结束时会自动销毁。
引用类型变量不引入对象,甚至可能不需要存储它们自己,但它们仍然具有存储持续时间(第 3.7/3 节)。如果引用确实需要存储,则会根据引用的存储时长释放。
因此,任何类型的局部变量声明都不会泄漏。实际上,您不能delete 具有自动存储持续时间的对象。这仅用于具有动态存储持续时间的对象,这些对象使用new 分配。
【讨论】:
MyType& var = *new MyType;之类的东西,你也可以用引用泄漏。
var 本身占用的空间。答案似乎没有涵盖它,因为var 不是对象。
在堆栈上分配的局部变量,即不使用内存分配函数或运算符,如malloc 和new,会被自动删除。所有其他变量都必须使用 delete 删除,因为它们存储在堆上。
【讨论】:
如果您手动分配内存,则必须在需要时将其删除,
例子:
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
}
【讨论】:
news 和deletes 放在一起。如果您不能这样做并且绝对必须这样做,请评论评论评论!
new 运算符),对于其他静态分配的变量而不使用 @ 987654325@没必要。
必须删除使用 malloc、realloc、new 和 new[] 动态分配的内存。这些在堆内存中。其他人会被自动释放。
【讨论】:
malloc或new的真正优势是什么?