假设您有以下函数:
void doSomething(){
int *data = new int[100];
}
为什么这会产生内存泄漏呢?由于我无法在函数外部访问此变量,为什么编译器不在每次调用此函数结束时自行调用delete?
为什么这会产生内存泄漏呢?
因为您有责任删除您使用其创建的任何内容new
.
为什么编译器不在每次调用该函数结束时自行调用delete?
通常,编译器无法判断您是否仍有指向已分配对象的指针。例如:
void doSomething(){
int *data = new int[100];
doSomethingElse(data);
}
Does doSomethingElse
只是在函数调用期间使用指针(在这种情况下我们仍然想删除这里的数组)?它是否存储指针的副本以供以后使用(在这种情况下我们还不想删除它)?编译器无法知道;由你来决定。与其制定复杂的、容易出错的规则(例如“除非您能弄清楚编译器必须知道没有其他引用它,否则您必须删除它”),该规则保持简单:您必须删除它。
幸运的是,我们可以做得比处理原始指针并尝试在正确的时间删除它更好。原理RAII https://stackoverflow.com/questions/2321511允许对象获得已分配资源的所有权,并在超出范围时调用其析构函数时自动释放它们。容器允许在单个范围内维护动态对象,并在需要时进行复制;智能指针允许在作用域之间移动或共享所有权。在这种情况下,一个简单的容器将为我们提供一个动态数组:
void doSomething(){
std::vector<int> data(100);
} // automatically deallocated
当然,对于像这样的小型固定大小数组,您不妨将其设置为自动:
void doSomething(){
int data[100];
} // all automatic variables are deallocated
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)