假设您具有以下功能:
void doSomething(){
int *data = new int[100];
}
为什么会产生内存泄漏?由于我无法在函数外部访问此变量,为什么每次调用此函数时编译器都不会自行调用delete?
解决方法
Why will this produce a memory leak?
因为您负责删除使用new创建的任何内容.
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