C++指针内存
这是一个关于C++指针的问题,思考了一下
void GetMemory(char *p, int num){
p = (char*) malloc (sizeof(char) * num);
}
void Test(void) {
char *str = NULL;
GetMemory(str,100);//str 仍为NULL
strcpy(str, "hello"); //运行错误
}
这个p等同于指针值传递,只是将p的值传递进去,然后申请内存
编译器会为函数每个参数制作临时副本,p的副本_p = p;
如果函数体修改了_p的内容,就导致p的内容也相应修改。
如果不修改_p,p也不变。反而每执行一次就泄露一块内存。
void GetMemory2(char **p, int num){
*p = (char*)malloc(sizeof(char) * num);
}
void Test2(void){
char *str = NULL;
GetMemory(&str,100);//参数是&tr
strcpy(str,"hello");
cout<<str<<endl;
free(str);
}
这是使用指向指针的指针来申请内存的,理解参考:http://www.cnblogs.com/dzry/archive/2011/05/12/2044835.html
这里p相当于指向了str,p申请了内存就相当于str申请了内存,个人觉得有点难理解
char *GetMemory3(int num){
char *p = (char*)malloc(sizeof(char) * num);
return p;
}
void Test3(void){
char *str = NULL;
str = GetMemory3(100);
strcpy(str,"hello");
cout<<str<<endl;
free(str);
}
这个就是在堆中申请了一段内存,然后返回给str,对于堆,栈,静态区的理解参考:http://my.oschina.net/liangtee/blog/126728
在GetMemory3中free(P)后,程序还是可以运行的,所以个人觉得free()释放内存是程序运行解释之后的,而不是马上就在函数运行是释放
参考:http://www.bccn.net/Article/kfyy/cyy/jszl/200608/4238_2.html
char *GetString(void){
char p[] = "hello world";
return p;//编译器出错
}
void Test4(void){
char *str = NULL;
str = GetString();//乱码
cout<<str<<endl;
}
返回的p被系统回收了,所以是野指针。因为这里是栈申请的存储空间。
char *GetString2(void){
char *p = "hello world";
return p;
}
void Test5(void){
char *str = NULL;
str = GetString2();
cout<<str<<endl;//输出hello world
}
p申请的是字符串常量,所以指针不变。
对指针又加深了一点点了解
参考于: C++高质量编程指南
C++指针内存的更多相关文章
- C语言 二级指针内存模型混合实战
//二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #i ...
- C语言 二级指针内存模型③
//二级指针内存模型③ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #incl ...
- Objective-C 【多个对象内存管理(野指针&内存泄漏)】
------------------------------------------- 多个对象内存管理(野指针&内存泄漏) (注:这一部分知识请结合"单个对象内存管理"去 ...
- Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏
Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题 今天使用Analyze 看了下项目, 解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...
- Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争
2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...
- 在用free()函数释放指针内存时为何要将其指针置空
在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题.释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将 ...
- C语言 二级指针内存模型②
//二级指针第二种内存模型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #incl ...
- C语言 二级指针内存模型①
//二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素 ...
- C/C++指针内存分配小细节
char *pc = NULL; pc = new char[0]; pc[0] = '1'; 相信初学者看见上面这段代码,都会觉得奇怪,new char[n]中的n指定给指针变量分配多少内存空间,而 ...
随机推荐
- tcpproxy:基于 Swoole 实现的 TCP 数据包转发工具的方法
假设我们希望有一台机器A(ip 192.168.1.101)要开放端口6379给用户访问,但可能实际情况是用户无法直接访问到A(ip 192.168.1.101), 但却有一台机器B(ip 192.1 ...
- Android应用插件式开发解决方法
转自:http://blog.csdn.net/arui319/article/details/8109650 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来 ...
- JavaEE基础(二十六)/网络
1.网络编程(网络编程概述) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...
- android使用其他应用打开文件
根据文件的MIME类型来判断,手机中有哪些应用可以打开这个文件,然后把应用在弹窗列表中显示 /** * 打开文件 * * @param file */ public static void openF ...
- 上传文件时,Request报文头不同浏览器会产生不同的content-type
选择一个zip文件上传,用IE看的报文头是image/jpeg,用chrom看是application/octet-stream. 第一次遇到这个类型的content-type,百度了一下, octe ...
- 网络编程中获取域名和id的方法
package com.lanqiao.java.test; import java.net.InetAddress;import java.net.UnknownHostException; pub ...
- 20150618_Andriod _KSOAP2_多线程
参考地址:http://blog.csdn.net/long704480904/article/details/8636734 webService:基于SOAP协议的远程调用标准,通过webServ ...
- Google Analytics Premium VS Adobe Analytics
在很久以前的互联网年代,Google收购了一家名为Urchin的公司,进而演化诞生了Google Analytics.当Goochin(Google / Urchin)首次亮相时,它被所有人称为“新的 ...
- pandas安装过程中提示unable to find vcvarsall.bat的解决方法
转载自:http://blog.csdn.net/qq_21144699/article/details/46849561 为这位老兄点赞 原帖参考:http://stackoverflow.com/ ...
- IOS自定义仪表盘
登录|注册 周海锋 的专栏 Objective-C/Cocos2d/Cocos2d-x/Php/JS 目录视图 摘要视图 订阅 2016软考项目经理实战班 学院周年礼-顶 ...