c++ 如何free泛型结构体成员指针

我自定义了多个结构体,
例如A结构体如下
typeset struct A{
int index;
char* buf;
}
B结构体如下
typeset struct B{
char name[8];
char* str;
}

然后使用模板写了一个队列类,其中写了一个函数来释放队列中的元素,大致意思如下

template
int Queuepop()
{
T p=this->front();
free(p);
}
声明两个队列:
Queue qa;
Queue qb;
使用pop函数,
很显然free结构体A或者B时候,A里面的buf指针和B里面的str指针并没有释放掉,请问该怎么释放呢?
能够判别泛型的实际类型然后依次free吗?有没有什么办法free结构体成员变量?

一种方法是在free前手动释放
if(p->str) {free(p->str); p->str = 0;}
free(p);
另一种方法是,给结构体添加析构函数(结构体是一种特殊的类,所以可以有析构函数),这样,当p被释放时,结构体中str的内容也自动调用析构函数释放str的内存。如果用析构函数,必须给str初始化。否则析构时会出错,可以通过构造函数来实现:
struct B(){str = 0;}
~struct B()
{
if(str) free(str); str = 0;
}

在结构体A 和B 里补充析构函数,析构的时候释放掉相应的成员对象即可。

free的时候先free掉结构体里面的指针,然后再整个结构体指针