这是一个关于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++指针内存的更多相关文章

  1. C语言 二级指针内存模型混合实战

    //二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #i ...

  2. C语言 二级指针内存模型③

    //二级指针内存模型③ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #incl ...

  3. Objective-C 【多个对象内存管理(野指针&内存泄漏)】

    ------------------------------------------- 多个对象内存管理(野指针&内存泄漏) (注:这一部分知识请结合"单个对象内存管理"去 ...

  4. Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题, Core Foundation 类型指针内存泄漏

    Analyze 静态分析工具中显示 大量的CF类型指针 内存leak 问题   今天使用Analyze 看了下项目,   解决办法,项目中使用了ARC,OC的指针类型我们完全不考虑release的问题 ...

  5. Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

    2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在 ...

  6. 在用free()函数释放指针内存时为何要将其指针置空

    在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题.释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将 ...

  7. C语言 二级指针内存模型②

    //二级指针第二种内存模型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #incl ...

  8. C语言 二级指针内存模型①

    //二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素 ...

  9. C/C++指针内存分配小细节

    char *pc = NULL; pc = new char[0]; pc[0] = '1'; 相信初学者看见上面这段代码,都会觉得奇怪,new char[n]中的n指定给指针变量分配多少内存空间,而 ...

随机推荐

  1. webapi获取请求地址的IP

    References required: HttpContextWrapper - System.Web.dll RemoteEndpointMessageProperty - System.Serv ...

  2. Composer使用中常见的问题

    安装了Composer后,运行 composer --version ,查看Composer的版本号.如果出现下面的提示,那么软件安装成功. Composer version 1.2.0 2016-0 ...

  3. C#.Net理论

    -------------2014年8月28---------------------------- 1.C#的委托是什么,事件是不是一种委托?答:委托可以把一个方法作为参数代入另一个方法.委托可以理 ...

  4. JavaScript脚本语言基础(一)

    导读: JavaScript代码嵌入HTML文档 JavaScript代码运行方式 第一个实例 JavaScript的三种对话框 定义JavaScript变量 JavaScript运算符和操作符 Ja ...

  5. SlickGrid example 3b: 支持撤销操作的编辑单元

    不同类型的属性可以按不同的风格编辑. 每个编辑单元可以设置不同的验证方法. 历史编辑可以撤销.   代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTM ...

  6. Ramsey theorem in Combinarotics

  7. The Cow Lexicon

    The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8815 Accepted: 4162 Descr ...

  8. sql中decode(...)函数的用法

    相当于if语句 decode函数比较1个参数时 SELECT ID,DECODE(inParam,'beComparedParam','值1' ,'值2') name FROM bank #如果第一个 ...

  9. Thread的六种状态

    线程共有6种状态:在某一时刻只能是这6种状态之一.这些状态由Thread.State这个枚举类型表示,并且可以通过getState()方法获得当前具体的状态类型. 包括(new,runnable,bl ...

  10. javascript encodeURI和encodeURIComponent的比较

    总结:encodeURI对除三种字符()之外的字符进行编码 encodeURIComponent对除两种字符之外的字符进行编码,保留字符会被转义 在进行SaaS前端开发的时候,大家经常会用到两个Jav ...