这是一个关于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. Android中Base64的简单使用

    服务端图片的信息被转化成字符串,传到android客户端,android端需要把这些信息再解码转化成图片并保存在本地. //编码部分 String string = Base64.encodeToSt ...

  2. vi的使用规则

    1.vi的基本概念 基本上vi可以分为三种状态,分别是 命令模式(command mode).插入模式(Insertmode)和  底行模式(last line mode) 各模式的功能区分如下: 1 ...

  3. linux添加somebody到组

    添加xiluhua到组:test_group usermod -a test_group  xiluhua

  4. jar包里查找指定的class文件,排查是否存在或重复,工具软件:Java Class Finder

    jar包里查找指定的class文件,排查是否存在或重复,工具软件:Java Class Finder 1,下载工具地址:www.idesksoft.com/classfinder.html,如图: 2 ...

  5. Install Hive

    一.Hive将元数据存储在RDBMS中,有三种模式可以连接到数据: 1.single User Mode:此模式连接到一个In-memory的数据库Derby,一般用于Unit Test. 2.Mul ...

  6. 【转】MYSQL入门学习之一:基本操作

    转载地址:http://www.2cto.com/database/201212/173868.html 1.登录数据库    www.2cto.com       命令:mysql -u usern ...

  7. IE6下 input 背景图滚动问题及标签规范

    ie6 背景图滚动问题: <title>ie6下input背景图滚动问题</title> <style> .box{ height:20px; width:300p ...

  8. ado.net基础思想-abstract

    抽象类用做基类不能被实例化用途是派生出其他非抽象类 接口主要是实现多重继承 abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的:• 抽象类不能 ...

  9. HDU 4706:Children's Day

    Children's Day Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  10. POJ 2406:Power Strings

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 41252   Accepted: 17152 D ...