类对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指向同一个地址。当它们析构时就会导致同一指针被释放两次,导致内存错误。
#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指向同一个地址。当它们析构时就会导致同一指针被释放两次,导致内存错误。