博客
关于我
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/

你可能感兴趣的文章
opencv1-加载、修改、保存图像
查看>>
opencv10-形态学操作
查看>>
opencv11-提取水平直线和垂直直线
查看>>
opencv12-图像金字塔
查看>>
opencv14-自定义线性滤波
查看>>
opencv15-边缘处理
查看>>
opencv16-Sobel算子
查看>>
opencv2-矩阵掩膜操作
查看>>
opencv21-像素重映射
查看>>
opencv22-直方图均衡化
查看>>
opencv23-直方图计算
查看>>
opencv24-直方图比较
查看>>
opencv25-直方图反向投影
查看>>
opencv26-模板匹配
查看>>
opencv27-轮廓发现
查看>>
opencv28-凸包
查看>>
opencv29-轮廓周围绘制矩形框和圆形框
查看>>
OpenCV3 install tutorial for Mac
查看>>
opencv3-Mat对象
查看>>
opencv30-图像矩
查看>>