繁体   English   中英

C++ - 动态分配变量的范围

[英]C++ - Scope of a Dynamically Allocated Variable

据我所知,动态分配的变量需要使用 delete 运算符删除,并且不会在作用域的末尾自动删除,就像静态变量的情况一样。

因此,在以下示例中,当循环运行第 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,上述程序没有报错。 根据我的理解,这是没有意义的。

我假设我对动态分配的变量的理解有问题。 有人可以澄清一下吗?

您的代码显示了所谓的“内存泄漏”。 p超出范围而没有先delete内存时,为每个循环迭代分配的内存就会丢失。 这(通常)不会导致编译器警告或运行时错误,因为编译器发现此类错误可能非常复杂。 不过,一些静态代码分析器可能能够检测到这一点。

在内存泄漏的情况下,您可能会注意到,您的程序运行时间越长,使用的内存就越多,这意味着内存泄漏在 RAM 低的系统和长时间运行的程序中尤其成问题,呃系统服务应该运行几天。

有一些特殊的工具可以查找内存泄漏,例如 Linux 的 valgrind 或 Visual Studio 调试运行时中的内置工具。

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

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

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

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

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

p的生命周期与其作用域一致,因为它是一个自动变量。 循环的每次迭代都有自己的变量,所有变量都具有相同的名称 - 没有多次初始化,因为变量是不同的。

p指向的对象的生命周期一直延续到其地址被传递给delete
由于您从不这样做,因此您创建的每个对象都带有new “泄漏”。

p 只是一个包含动态数据地址的静态变量,指针本身在作用域结束时丢失,而动态数据持续存在而没有指针访问它(内存泄漏)。

p 指向的数据是动态内存(在堆中)并且不会在每次迭代后被释放,但是,变量 p 本身的内容(这是动态数据的地址,如果你去内存中的 p在堆栈中找到一个简单的数字,它只是堆中动态数据的地址,而不是数据本身)只是堆栈中的一个静态地址,它在范围结束时丢失(迭代)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM