void指针使用(避坑)

void*用好了会很方便

Posted by 雯饰太一 on June 25, 2023

void指针使用(避坑)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void GetVoid(void* pV)
{
	void*& pp = *(void**)pV;
	int* aPtr = *(int**)pp;
	int a = *aPtr;//10

	double* pd = new double;
	*pd = 100.0;

	pp = (void*)&pd;
}

int main(int argc, char* argv[])
{
	
	int a = 10;
	int* aPtr = &a;
	void* pV = (void*)&aPtr;
	GetVoid((void*)&pV);

	void* pw = *(void**)&pV;
	double* dpp = *(double**)pV;
	double dd = *dpp;//100.0
}

使用void ptr的时候,其实就是一个疯狂开门关门的情况,可以对任意门进行定位,可以按照期望的类型开门取值,但是上述代码中new出来的double值还是没有释放的,int值因为是一个局部变量,只是将地址转换成了void ptr带入了函数,是不需要释放的。

void ptr自身可以认为是一个指针类型的变量,是不需要释放的。

再一看,这里使用的是address of void ptr,实际上就是void**,用起来更花,不推荐,这种代码简直没法看,推荐少些,放在这里,长个记性吧。

void*数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main(int argc, char* argv[])

//malloc arr
	void** voidArr;
	int voidArrSize = 3;
	voidArr = (void**)malloc(voidArrSize * sizeof(void*));

	//test val
	int typeIntVal = 10;
	double typeDoubleVal = 100.0;
	const char* typeCharPtrVal = "name";

	//init arr
	voidArr[0] = (void*)&typeIntVal;
	*(voidArr + 1) = (void*)&typeDoubleVal;
	voidArr[2] = (void*)typeCharPtrVal;

	//get val
	int _typeIntVal = *(int*)voidArr[0];//10
	double _typeDoubleVal = *(double*)*(voidArr+1);//100.0
	const char* _typeCharPtrVal = (const char*)*(voidArr + 2);//"name"

	//free
	free(voidArr);
	voidArr = nullptr;
}

备注:方便用于参数传递,毕竟指针都是一样长的,但正因为没有类型,所以在排查的时候比较困难。