C++ 有关指针作为函数参数的问题,自定义内存分配函数传递二级指针的问题
如题所示,我们主要讨论在自定义的内存分配函数中通常见到的代码如下所示:
void Create(A** addr);
其中传递的参数是二级指针。为什么?
我们先看一下完整的动态内存分配函数的简单例子:
struct A {
int a = 0;
int b = 0;
int c[3];
};
void Create(A** addr) {
printf("a1: %p\n", addr);
*addr = new A();
printf("a2: %p\n", addr);
}
int main() {
A *a;
printf("a0: %p\n", a);
Create(&a); // 传递二级指针值
printf("a4: %p\n", a);
return 0;
}
我们看下函数运行结果:

我们看到传进去的*a的值改变了,而且这个改变作用到了*a本身
在看下我们一般情况下想到的分配方式:
struct A {
int a = 0;
int b = 0;
int c[3];
};
void Create(A* addr) {
printf("a1: %p\n", addr);
addr = new A();
printf("a2: %p\n", addr);
}
int main() {
A *a = nullptr;
printf("a0: %p\n", a);
Create(a); 传进去指针本身
printf("a4: %p\n", a);
return 0;
}
同时我们在看下结果:

我们看到对指针的操作,并没有作用到指针本身。这是因为哪怕我们传进去的是个指针,但是还是以值传递的方式传递指针的值。
具体的过程是,我们在*a传递到函数里面时,函数自身创建了一个中间变量,我们姑且称他为temp,这个temp的值为 a,我们后面进行new之后也只是简单的将
分配后的内存地址给了temp,所以才会出现上面结果。
但是对于二级指针而言,传进去的是指针的地址,对指针地址所指值进行操作,当然会改变指针本身的值。
其实该种方式也可以等价于:
struct A {
int a = 0;
int b = 0;
int c[3];
};
void Create(A* &addr) {
printf("a1: %p\n", addr);
addr = new A();
printf("a2: %p\n", addr);
}
int main() {
A *a;
printf("a0: %p\n", a);
Create(a);
printf("a4: %p\n", a);
return 0;
}
结果如下所示:

我们传进去的是指针的引用,当然会作用到指针本身。
C++ 有关指针作为函数参数的问题,自定义内存分配函数传递二级指针的问题的更多相关文章
- C标准库-数值字符串转换与内存分配函数
原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); dou ...
- Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)
Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc) 来源:http://blog.csdn.net/chunyexiyu/article/ ...
- C语言之内存分配函数
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /********* ...
- 内存分配函数malloc、realloc、calloc、_alloca
1.内存分配函数_alloca.malloc.realloc.calloc: _alloca 函数原型void * __cdecl _alloca(size_t); 头文件:malloc.h _all ...
- 【转】【C/C++】内存分配函数:malloc,calloc,realloc,_alloca
转自:http://www.cnblogs.com/particle/archive/2012/09/01/2667034.html#commentform malloc: 原型:extern voi ...
- Linux内核中常见内存分配函数(二)
常用内存分配函数 __get_free_pages unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order) __get_f ...
- Linux内核中常见内存分配函数【转】
转自:http://blog.csdn.net/wzhwho/article/details/4996510 1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...
- Linux内核中常见内存分配函数
1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...
- C语言内存分配函数malloc——————【Badboy】
C语言中经常使用的内存分配函数有malloc.calloc和realloc等三个,当中.最经常使用的肯定是malloc,这里简单说一下这三者的差别和联系. 1.声明 这三个函数都在stdlib.h库文 ...
随机推荐
- javascript函数式编程基础随笔
JavaScript 作为一种典型的多范式编程语言,这两年随着React\vue的火热,函数式编程的概念也开始流行起来,lodashJS.folktale等多种开源库都使用了函数式的特性. 一.认识函 ...
- TypeScript注意
中文文档中,元组目前已经不能越界访问
- 第二章epoll
epoll_create:函数实现分析 /* * Open an eventpoll file descriptor. */ SYSCALL_DEFINE1(epoll_create1, int, f ...
- 极客mysql38
InnoDB 引擎把数据放在主键索引上,其他索引上保存的是主键 id.这种方式,我们称之为索引组织表(Index Organizied Table). 而 Memory 引擎采用的是把数据单独存放,索 ...
- TCP粘包问题的解决方案02——利用readline函数解决粘包问题
主要内容: 1.read,write 与 recv,send函数. recv函数只能用于套接口IO ssize_t recv(int sockfd,void * buff,size_t len,i ...
- 利用虚拟化环境虚拟nvme盘
前情介绍 SPDK SPDK的全称为Storage Performance Development Kit ,是Intel发起的一个开源驱动项目,这个是一个开发套件,可以让应用程序在用户态去访问存储资 ...
- Linux下如何创建loop device
在Linux中,有一种特殊的块设备叫loop device,这种loop device设备是通过映射操作系统上的正常的文件而形成的虚拟块设备 因为这种设备的存在,就为我们提供了一种创建一个存在于其他文 ...
- Python_多进程_pool进程池
多进程典型案例: 1.将子进程的进程名作为列表中的元素,在父进程中遍历(异步)执行 #coding: utf-8 from multiprocessing import Pool import os, ...
- 我要进大厂之大数据MapReduce知识点(2)
01 我们一起学大数据 今天老刘分享的是MapReduce知识点的第二部分,在第一部分中基本把MapReduce的工作流程讲述清楚了,现在就是对MapReduce零零散散的知识点进行总结,这次的内容大 ...
- sql字段长度等于
select count(*) from boc_loan_apply where length(birthday)=7;