指针移动语义用来代替指针赋值过程,使得指针赋值后源指针为空,避免两个指针指向同一段内存块。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void *ptr_move(void *ptr)
{
void **pptr = (void **)ptr;
void *tmp = *pptr;
*pptr = NULL;
return tmp;
}
void ptr_free(void *ptr)
{
void **pptr = (void **)ptr;
free(*pptr);
*pptr = NULL;
}
int main()
{
int *a = NULL;
int *b = NULL;
printf("a=%p, b=%p\n", a, b);
a = malloc(10 * sizeof(int));
printf("a=%p, b=%p\n", a, b);
b = ptr_move(&a);
printf("a=%p, b=%p\n", a, b);
ptr_free(&b);
printf("a=%p, b=%p\n", a, b);
return 0;
}
程序运行结果,可以看到在打印的时间点,只有一个指针指向了目标内存块。
a=(nil), b=(nil)
a=0x5629589286b0, b=(nil)
a=(nil), b=0x5629589286b0
a=(nil), b=(nil)