c – 为什么必须为存储在堆中的函数的局部变量调用delete?

前端之家收集整理的这篇文章主要介绍了c – 为什么必须为存储在堆中的函数的局部变量调用delete?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设您具有以下功能
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

猜你在找的C&C++相关文章