类对void*成员释放空间的有关问题//程序编译能过,但是运行出现内存异常

类对void*成员释放空间的问题//程序编译能过,但是运行出现内存错误
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;

class anything{
public:
  anything(){name=NULL;age=NULL;}
  anything(char* cp_name,void* cp_age)
  {
  name = new char[strlen(cp_name)+1+1];
  strcpy(name,cp_name);
   
  age = new char[strlen((char*)cp_age)+1+1];
  strcpy((char*)age,(char*)cp_age);
  }
   
  anything(const anything& anything01)
  {
  name = new char[strlen(anything01.name)+1+1];
  strcpy(name,anything01.name);
   
  age = new char[strlen((char*)anything01.age)+1+1];
  strcpy((char*)age,(char*)anything01.age);
  }
  anything operator+ (const anything& anything01)
  {
  char* swap = new char[strlen(name)+strlen(anything01.name)+1+1+1+1];
  strcpy(swap,name);
  char* c = new char[2];
  strcpy(c,",");
  strcat(swap,c);
  strcat(swap,anything01.name);
   
  char* buf = new char[128];//age成员的处理
  sprintf(buf,"%s,%s",static_cast<char*>(this->age),static_cast<char*>(anything01.age));
  anything anything_temp(swap,static_cast<void*>(buf));
  delete[] c;
  c = NULL;
  delete[] buf;
  buf = NULL;
  delete[] swap;
  swap = NULL;
  return anything_temp;
  }
   
  ostream& operator>>(ostream&os)//输出函数
  {
  return os<<name<<" "<<static_cast<char*>(age);
  }
   
  ~anything()//析构函数
  {
  if(name)
  {
  delete[] name;
  name=NULL;
  }
  if((char*)age)
  {
  delete[] (char*)age;
  age = NULL;
  }
  }
private:
  char* name;
  void* age;
};

int main()
{
  char*object_age01="25",*object_age02="30";
   
  anything anything02("Jackson",static_cast<void*>(object_age01)),anything03("Edward",static_cast<void*>(object_age02)),anything04;
   
  anything04=anything02+anything03;
   
  anything04>>cout<<endl;
  return 0;
}

------解决方案--------------------
类anything没有定义operator=:
anything& operator= (const anything& anything01)
故当有anything的赋值发生时,程序采取缺省动作:简单地复制name和age的指针值。因此,当如下赋值发生后:
anything04=anything02+anything03;
anything04和右边的临时变量的name指向同一个地址。当它们析构时就会导致同一指针被释放两次,导致内存错误。