博客
关于我
C++基础(六)栈、堆、new关键字、delete关键字
阅读量:265 次
发布时间:2019-03-01

本文共 1499 字,大约阅读时间需要 4 分钟。

全局变量、静态变量及常量的存储位置分析

在编程中,理解变量的存储位置对程序的运行机制有着深刻的影响。全局变量、静态变量和常量的存储位置各有不同,这一点对于任何一个C程序员来说都至关重要。

全局变量的存储位置在程序的运行时环境中。全局变量是指在程序运行时,所有函数都能访问的变量。它们的生命周期从程序开始直到程序结束。

静态变量的存储位置则是在程序的运行时内存中,但它们的生命周期与函数的调用有关。静态变量通常在函数内部声明,程序运行时只会初始化一次,并在程序结束后未被销毁。

至于常量,它们的存储位置取决于如何定义。如果是一个本地常量(如int main()中的常量),则会在程序运行时的栈中分配存储空间。如果是一个全局常量(如const int GLOABL_CONST = 123;),则会在程序的全局内存区分配存储空间。

局部变量的声明周期与栈的使用有关。在函数调用时,局部变量会被压入栈中,函数返回后变量会被弹出栈中,释放内存空间。这种机制允许程序在多次函数调用时,正确地管理局部变量的内存。

关于动态内存管理,C语言提供了new和delete操作符来手动管理内存。在使用new操作符时,程序会在堆中分配一块内存空间,并将指针返回。使用delete操作符时,程序会释放这块内存空间。需要注意的是,使用new时如果分配的是数组,必须使用delete[]来释放;如果分配的是单个对象,使用delete即可。

例如,在以下代码中,run()函数使用new操作符在堆中分配一块内存,返回指针。main函数调用run()获取指针并输出值。需要注意的是,调用delete操作符后,指针将失效,不能再被使用。

#include 
using namespace std;int* run() { int a = 100; int* a1 = new int(100); return a1;}int main() { int * p = run(); cout << *p << endl; delete p; // 不能再使用p指针了 system("pause"); return 0;}

在另一个例子中,run2函数使用new操作符分配一个内存块,返回指针。main函数调用run2获取指针数组p2,并在循环中修改数组中的值。最后使用delete[] p2来释放数组内存。

#include 
using namespace std;int* run() { int a = 100; int* a1 = new int(100); return a1;}int* run2() { int* p = new int[10]; return p;}int main() { int * p = run(); cout << *p << endl; delete p; int* p2 = run2(); for (int i = 0; i < 10; i++) { p2[i] = 100 + i; } for (int i = 0; i < 10; i++) { cout << p2[i] << endl; } delete[] p2; system("pause"); return 0;}

这些机制为程序提供了对内存的精确控制,但也需要程序员谨慎管理,避免内存泄漏或指针失效。

转载地址:http://efzo.baihongyu.com/

你可能感兴趣的文章
oracle创建表(并且实现ID自增)
查看>>
oracle删除重复数据保留第一条记录
查看>>
oracle判断空值的函数nvl2,【PL/SQL】 NVL,NVL2,COALESCE 三种空值判断函数
查看>>
Oracle发布VirtualBox 7.1稳定版!支持ARM、优化了UI、支持Wayland等
查看>>
oracle启动关闭服务,启动关闭oracle服务.bat
查看>>
Oracle命令行创建数据库
查看>>
Oracle和SQL server的数据类型比较
查看>>
oracle在日本遇到的技术问题
查看>>
oracle基础 管理索引
查看>>
oracle如何修改单个用户密码永不过期
查看>>
oracle字符集
查看>>
Oracle学习
查看>>
oracle数据库笔记---oracleweb视图使用流程,及plsql安装
查看>>
Transformer 架构解释
查看>>
Oracle数据库表空间 数据文件 用户 以及表创建的SQL代码
查看>>
Oracle数据库验证IMP导入元数据是否会覆盖历史表数据
查看>>
Oracle未开启审计情况下追踪表变更记录
查看>>
Oracle查看数据库会话连接
查看>>
Oracle查询前几条数据的方法
查看>>
oracle树形查询 start with connect by
查看>>