C/C++内存分配方式 .
代码区(code area)
|
程序内存空间
|
全局数据区(data area)
|
|
堆区(heap area)
|
|
栈区(stack area)
|
int a = 0; //全局初始化区
char *p1; //全局未初始化区
int main() {
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456/0在常量区,p3在栈上。
static int c =0;//全局(静态)初始化区
p1 = new char[10];
p2 = new char[20];
//分配得来得和字节的区域就在堆区。
strcpy(p1, "123456"); //123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
|
int main(){
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return 0;
}
|
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a = p[1]; 0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 mov al,byte ptr [edx+1] 00401073 88 45 FC mov byte ptr [ebp-4],al |
class Time{
public:
Time(int,int,int,string);
~Time(){
cout<<"call Time's destructor by:"<<name<<endl;
}
private:
int hour;
int min;
int sec;
string name;
};
Time::Time(int h,int m,int s,string n){
hour=h;
min=m;
sec=s;
name=n;
cout<<"call Time's constructor by:"<<name<<endl;
}
int main(){
Time *t1;
t1=(Time*)malloc(sizeof(Time));
free(t1);
Time *t2;
t2=new Time(0,0,0,"t2");
delete t2;
system("PAUSE");
return EXIT_SUCCESS;
}
|
解决办法:在使用内存之前检查指针是否为NULL。如果指针P是函数的参数,那么在函数的 入口处用assert(p != NULL)进行检查。如果用malloc或new申请内存,应该用if(p == NULL )或if(p != NULL)进行防错处理。
2、内存虽然分配成功,但是尚未初始化就引用它。
产生错误原因:1、没有初始化的概念2、误以为内存的缺省初值全为零,导致引用初值错误 (例如数组)。
3、内存分配成功并且已经初始化,但操作越过了内存的边界。
例如使用数组时经常发生下标“多1”“少1”的操作。在for循环语句中,循环次数容易搞 错,导致数组操作越界。
4、忘记释放内存,照成内存泄露。
含有这种错误的函数每被调用一次就丢失一块内存。刚开始看不到错误,终有一次程序突然 死掉,系统提示:内存耗尽。
5、释放了内存却继续使用它。
三种情况:1、程序中调用关系过于复杂,难以搞清楚某个对象究竟是否已经释放了内存, 此时应该重新设计数据结构,从根本上解决对象管理混乱的局面。2、函数的return语句写 错,注意不要返回指向“栈内存”的“指针”或者“引用”,因该内存在函数体结束时被自 动销毁。3、使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针 ”。
C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住了它。sizeof(p)得到的是指针变量的字节数。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
(1)指针消亡了,并不表示它所指的内存会被自动释放。
(2)内存被释放了,并不表示指针会消亡或者成了NULL指针。
通常有三种方式处理“内存耗尽”的问题:(1)判断指针是否为NULL,如果是则马上用return语句终止本函数。(2)判断指针是否为NULL,如果是则马上用exit(1)语句终止本函数。(3)为new和malloc设置异常处理函数。
C/C++内存分配方式 .相关推荐
- C/C++:程序的内存分配方式
转载自:http://ryansky.blog.51cto.com/187974/86286 1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内 ...
- C语言程序的内存分配方式
1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数 ...
- 内存分配方式以及堆和栈的区别
转载:https://blog.csdn.net/shanchangyi/article/details/51854795 对于一个程序要运行,涉及到的内存分配是一个首要问题,这里简单说一下一个简单的 ...
- C++内存分配方式、内存错误及其对策
C++内存分配方式.内存错误及其对策 内存分配方式有三种: 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. 在栈上创建.在执 ...
- C++中内存分配方式、空指针及野指针的区别
一.C++中内存分配方式可以分为三种: (1)从静态存储区域分配: 内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在.速度快.不容易出错,因为有系统会善后.例如全局变量,static变 ...
- MFC 教程【10_内存分配方式和调试机制 】
内存分配方式和调试机制 M内存分配 内存分配函数 MFCWin32或者C语言的内存分配API,有四种内存分配API可供使用. Win32的堆分配函数 每一个进程都可以使用堆分配函数创建一个私有的堆── ...
- Windows下动态内存分配方式http://whx.tzgt.gov.cn/newOperate/html/7/71/711/3938.html
这里的"动态内存"包含以下两个方面的内容: 1.内存.这里的"内存"指的是进程的虚拟内存空间.在Win32环境下,每一个进程拥有独立的,大小为4G(0x00 ...
- 内存分配方式及常见错误
内存操作对于程序开发人员来说,永远是一块雷区.在这片区域,总是不断的埋雷.排雷,而且往往是排雷花了非常大的代价.记得在公司实习时,有大概2个星期的时间,team的几个人去排雷--有地方发生了memor ...
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函数时,函数内局 ...
最新文章
- php 自增,php 根据自增id创建唯一编号类
- hadoop下的Kmeans算法实现
- Bootsrap基本应用
- Spring @transactional annotation 事务使用详解
- 简约易收录的导航网站源码
- Java校招笔试题-Java基础部分(一)
- 原码 反码 补码 详解
- Firemonkey的旁门左道[六]
- docker 实战---使用oracle xe作为开发数据库(六)
- RHEL6 开启远程桌面
- jieba分词工具的使用-python代码
- 常见浏览器兼容性问题及解决办法总结
- smb协议讲解_SMB/CIFS协议解析一概述
- ubuntu下使用vscode阅读内核源码或uboot源码使用技巧——search.excludefiles.exclude
- 需求开发应用部署“一条龙”,平安云如何加速容器场景落地
- JQuery从入门到实战
- 2023前端vue高频面试题
- 用C语言解析通讯协议数据,C/C++知识点之服务端使用c++实现websocket协议解析及通信...
- 亚马逊运营选品时的几个小技巧,爆款日出千单
- 【无标题】win11安装Oracle 12c [INS-32102] 指定的 Oracle 主目录用户已存在