下面是一段漏洞百出的代码:
#include <string.h>
#include <stdio.h>
class Base
...{
private:
char * name;
public:
Base(char * className)
...{
name = new char[strlen(className)];
strcpy(name, className);
}
~Base()
...{
delete name;
}
char * copyName()
...{
char newname [256];
strcpy(newname, name);
return newname;
}
virtual char * getName()
...{
return name;
}
static void print(Base base)
...{
printf("name: %s /n" , base.name);
}
};
class Subclass : public Base
...{
public:
Subclass(char * className) : Base(className)
...{
}
};
int main()
...{
Base * pBase = new Subclass("test");
Base::print(*pBase);
printf("name: %s /n", pBase->getName());
printf("new name: %s/n ", pBase->copyName());
return 0;
}
这是经过修改的:
#include <string.h>
#include <stdio.h>
#include <stdio.h>
class Base
{
private:
char * name;
public:
Base(char * className = NULL)
{
name = new char[strlen(className)+1];
strcpy(name, className);
name[strlen(className)] = '/0';
}
{
private:
char * name;
public:
Base(char * className = NULL)
{
name = new char[strlen(className)+1];
strcpy(name, className);
name[strlen(className)] = '/0';
}
Base(Base& base)
{
if ( base.name )
{
name = new char[strlen(base.name)+1];
strcpy(name, base.name);
name[strlen(base.name)] = '/0';
}
else
name = '/0';
}
{
if ( base.name )
{
name = new char[strlen(base.name)+1];
strcpy(name, base.name);
name[strlen(base.name)] = '/0';
}
else
name = '/0';
}
~Base()
{
if ( name )
delete []name;
}
{
if ( name )
delete []name;
}
char * copyName()
{
char* newname = new char[strlen(name)+1];
strcpy(newname, name);
newname[strlen(name)] = '/0';
return newname;
}
{
char* newname = new char[strlen(name)+1];
strcpy(newname, name);
newname[strlen(name)] = '/0';
return newname;
}
virtual char * getName()
{
return name;
}
{
return name;
}
static void print(Base base)
{
printf("name: %s/n" , base.name);
}
};
{
printf("name: %s/n" , base.name);
}
};
class Subclass : public Base
{
public:
Subclass(char * className) : Base(className)
{
}
};
{
public:
Subclass(char * className) : Base(className)
{
}
};
int main()
{
Base * pBase = new Subclass("test");
{
Base * pBase = new Subclass("test");
Base::print(*pBase);
printf("name: %s/n", pBase->getName());
printf("name: %s/n", pBase->getName());
char * tempName = pBase->copyName();
printf("new name: %s/n", tempName);
delete []tempName;
printf("new name: %s/n", tempName);
delete []tempName;
delete pBase;
return 0;
}
}
本文展示了一段存在内存管理问题的C++代码,并通过详细分析指出了其中的问题所在,如构造函数中未分配足够的内存空间、析构函数中未正确释放内存、拷贝构造函数缺失等。随后给出了修改后的代码示例,展示了如何正确地实现类成员变量的内存分配与释放。
472

被折叠的 条评论
为什么被折叠?



