2016-10-28 112 views
0

从我所了解到的情况来看,动态分配的变量需要使用delete操作符来删除,并且不会在范围末尾自动删除,例如静态变量。C++ - 动态分配变量的范围

因此,在以下示例中,当循环运行第2次和第3次时,不应该为“int * p = new int;”由于动态分配的内存'p'没有被删除,因此被多次初始化?

#include<iostream> 
using namespace std; 

void main() 
{ 
    int i = 2; 

    while (i > -1) 
    { 
    int *p=new int; 

    *p = 5; 

    cout << *p; 

    --i; 
    } 
} 

使用Visual Studio 2015,上述程序没有提供任何错误。根据我的理解,这没有任何意义。

我假设我的理解动态分配的变量有问题。任何人都可以澄清?

回答

1

你的代码显示了所谓的“内存泄漏”。当p超出范围而没有首先使用存储器时,为每个循环迭代分配的存储器将丢失。这(通常)不会导致编译器警告或运行时错误,因为编译器找到这种错误可能相当复杂。一些静态代码分析器可能能够检测到这一点。

在内存泄漏的情况下,您可能会注意到,程序运行时间越长,内存泄漏在内存较低的系统和长时间运行的程序中尤其成问题,啊系统服务应该运行几天。

有特殊的工具来查找内存泄漏,例如用于Linux的valgrind或用于Visual Studio的调试运行时的内置工具。

0

您不能动态分配变量,只能对象。

p不是动态分配的对象,而是*p - 由new创建的对象 - 是。
delete p不会删除p但它指向的对象。

范围是一个适用于名称的语法编译时间属性。

具有名称的变量p具有范围。
它指向的对象是未命名的,因此范围的概念甚至不适用于它。

在运行时,p和它指向的对象都有一个生命周期。

p的寿命与其范围相符,因为它是一个自动变量。循环的每次迭代都有自己的变量,所有变量都具有相同的名称 - 没有多个初始化,因为变量是不同的。

p指向的对象的生命周期,直到它的地址传递给delete
既然你永远不会那么做,你用new创建的每个对象都会“泄漏”。