Linux下C++内存管理的指针传递详解

指针参数是如何传递内存的?

如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句 GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么?

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"); // 运行错误
}

示例试图用指针参数申请动态内存

毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p, 编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针 可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把 _p所指的内存地址改变了,但是p丝毫 未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为 没有用free释放内存。

如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例4.2。

void GetMemory2(char **p, int num)
{
 *p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
 char *str = NULL;
 GetMemory2(&str, 100); // 注意参数是 &str,而不是str
 strcpy(str, "hello");
 cout<< str << endl;
 free(str);
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 内存
, 函数
, 参数
, linux c++
, char
, str
, 内存申请
, 指针 参数
, 指针strcpy内存
, C++指针详解
, 指针详解
, char指针
指针参数
linux 共享内存中指针、linux内存管理详解、linux 内存详解、linux 虚拟内存详解、c语言指针详解,以便于您获取更多的相关知识。

时间: 2025-01-26 19:46:31

Linux下C++内存管理的指针传递详解的相关文章

Linux编程C++内存管理的指针传递详解

指针参数是如何传递内存的? 如果函数的参数是一个指针,不要指望用该指针去申请动态内存.示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么? 1 2 3 4 5 6 7 8 9 10 void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMe

Linux下进程内存管理之malloc和sbrk

之前自己突发兴趣想写一下malloc函数,顺便了解一下进程的内存管理.在写的过程中发现其实malloc只不过是通过调用Linux下的sbrk函数来实现内存的分配,只是在sbrk之上加了一层对所分配的内存的管理罢了,而sbrk以及brk是实现从虚拟内存到内存的映射的.在实际动手写之前先来了解一下Linux下一个进程的内存空间分配. 进程内存空间分配 Linux下每个进程所分配的虚拟内存空间是3G,但实际使用过程中不可能也没有必要为一个进程分配如此大的空间,毕竟内存是很宝贵的资源.当一个进程执行的时

C语言指针传递详解

传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问,要在某个函数中修改数据,需要用指针传递数据,当数据是需要修改 的指针的时候,就要传递指针的指针,传递参数(包括指针)的时候,传递的是它们的值,也就是说,传递给函数的是参数值的一个副本 本文将讨论C语言中指针传递给函数与从函数返回指针 本文地址:http://www.cnblogs.com/archimedes/p/c-transfer-point.html,转载请注明源地址. 用指针传递数据 用指针传递数据的一个主要原因是

Linux下MySQL安装配置 MySQL配置参数详解_Mysql

一.下载编译安装 #cd /usr/local/src/ #wget http://mysql.byungsoo.net/Downloads/MySQL-5.1/mysql-5.1.38.tar.gz #tar –xzvf mysql-5.1.38.tar.gz ../software/ #./configure --prefix=/usr/local/mysql //MySQL安装目录 --datadir=/mydata //数据库存放目录 --with-charset=utf8 //使用UT

LINUX下Oracle数据导入导出的方法详解_oracle

本文讲述了LINUX下Oracle数据导入导出的方法.分享给大家供大家参考,具体如下: 一. 导出工具 exp 1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin exp导出工具将数据库中数据备份压缩成一个二进制系统文件.可以在不同OS间迁移   它有三种模式: a.  用户模式: 导出用户所有对象以及对象中的数据: b.  表模式: 导出用户所有表或者指定的表: c.  整个数据库: 导出数据库中所有对象. 2. 导出工具exp交互式命令行方式的使用的例子: $ex

在Linux下创建分区和文件系统的方法详解

  在 Linux 中创建分区或新的文件系统通常意味着一件事:安装 Gnome Parted 分区编辑器(GParted).对于大多数 Linux 用户而言,这是唯一的办法.不过,你是否考虑过在终端创建这些分区和文件系统?当然可以!以下就是方法! 使用 CFdisk 创建一个基本的 Linux 分区 以下是如何在命令行中创建一个基本的 Linux 分区的正确方案.要做的第一件事就是先打开你的终端.若你已打开,你需要找到你想要创建分区的磁盘.这可以使用一个简单的命令来找到. 复制代码 代码如下:

linux下history(历史)命令用法详解

 如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的15个用法. 1. 使用 HISTTIMEFORMAT 显示时间戳 当你从命令行执行 history 命令后,通常只会显示已执行命令的序号和命令本身.如果你想要查看命令历史的时间戳,那么可以执行: # export HISTTIMEFORMAT='%F %T ' # history | more 1 2008-08-05 19:02:39 serv

Linux下配置完整安全的DHCP服务器详解

DHCP是动态主机配置协议.这个协议用于向计算机自动提供IP地址,子网掩码和路由信息.网络管理员通常会分配某个范围的IP地址来分发给局域网上的客户机.当设备接入这个局域网时,它们会向 DHCP 服务器请求一个 IP 地址.然后DHCP服务器为每个请求的设备分配一个地址,直到分配完该范围内的所有 IP 地址为止.已经分配的IP地址必须定时地延长借用期.这个延期的过程称作leasing,确保了当客户机设备在正常地释放IP地址之前突然从网络断开时被分配的地址可以归还给服务器.本文以Redhat Lin

nginx/linux下配置php+mysql环境具体方法详解

先我们要准备配置环境的文件 Nginx 下载地址: http://nginx.org/download/nginx-1.3.14.zip PHP 下载地址: http://windows.php.net/downloads/releases/php-5.2.17-nts-Win32-VC6-x86.zip MySQL 下载地址:http://www.mysql.com/downloads/installer/ 2.安装配置nginx: 解压nginx,修改配置文件:  代码如下 复制代码 ser