假设您具有以下功能:
void doSomething(){ int *data = new int[100]; }
解决方法
Why will this produce a memory leak?
Why doesn’t the compiler call delete by itself every time a call to this function ends?
通常,编译器无法判断您是否仍具有指向已分配对象的指针.例如:
void doSomething(){ int *data = new int[100]; doSomethingElse(data); }
doSomethingElse只是在函数调用期间使用指针(在这种情况下,我们仍然想在这里删除数组)?它是否存储指针的副本以供以后使用(在这种情况下我们不想删除它)?编译器无法知道;你可以告诉它.而不是制作一个复杂的,容易出错的规则(比如“你必须删除它,除非你能弄清楚编译器必须知道没有其它的引用”),规则很简单:你必须删除它.
幸运的是,我们可以做得更好,而不是玩杂耍原始指针并尝试在正确的时间删除它. RAII的原则允许对象获取已分配资源的所有权,并在它们超出范围时调用析构函数时自动释放它们.容器允许动态对象在单个范围内维护,并在需要时复制;智能指针允许在范围之间移动或共享所有权.在这种情况下,一个简单的容器将为我们提供一个动态数组:
void doSomething(){ std::vector<int> data(100); } // automatically deallocated
当然,对于像这样的小型固定大小的数组,您可能只需将其自动化:
void doSomething(){ int data[100]; } // all automatic variables are deallocated