大家来找茬!

hengjiweiye777 2007-07-19 12:07:30
不借助编译器看看
你能挑出多少毛病

#include <string.h>
#include <stdio.h>

/**
* There're some serious issues in class Base and Subclass.
* You should check for current and POTENTIAL bugs in them,
* especially memory problems.
*/

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;
}
...全文
213 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2007-07-19
  • 打赏
  • 举报
回复
楼主在倒分……
iambic 2007-07-19
  • 打赏
  • 举报
回复
不借助编译器?没有编译器重构是无法难进行的。
做鸡真好吃 2007-07-19
  • 打赏
  • 举报
回复
rt~
我啃 2007-07-19
  • 打赏
  • 举报
回复
virtual char * getName()
{
return name;
}
暴露私有成员,很危险,万一被释放了,然后析构就会出事,但是析构是不容许出事的
还有const符号没有合理使用

很多很多,都不好意思看下去了~
healer_kx 2007-07-19
  • 打赏
  • 举报
回复
编译是小,接分是大.
liujiwei2007 2007-07-19
  • 打赏
  • 举报
回复
#include <cstring>
#include <cstdio>
using namespace std;

/**
* There're some serious issues in class Base and Subclass.
* You should check for current and POTENTIAL bugs in them,
* especially memory problems.
*/
const int buff_size = 256;

class Base
{
private:
char *name;
public:
Base(const char * na) // 合理的声明
{
if (na) { // 初步的合法性验证
// 少了一个结束符的位置。
name = new char[strlen(na) + 1];
strcpy(name, na);
}
else {
name = 0;
}
}
Base(const Base & rvalue) // 防止错误的拷贝构造发生
{
if (rvalue.name) {
name = new char[strlen(rvalue.name) + 1];
strcpy(name, rvalue.name);
}
else {
name = 0;
}
}

virtual ~Base() // 应该为虚函数
{
delete[] name; // delete[]要对应new[]
}

const char * copyName() // 原本返回的是临时变量地址
{
static char buff[buff_size];
strncpy(buff, name, buff_size - 1); // 防止溢出
buff[buff_size - 1] = 0;
return buff;
}

virtual const char *getName()
{
return name;
}

static void print(const Base& base) // 原来拷贝时会出错
{
printf("name: %s\n", base.name);
}
};

class Subclass: public Base
{
public:
Subclass(const char *className): Base(className){}
// Subclass 没有提供getName对应的虚函数体,将共用一个虚函数实体。
};

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;
}
我啃 2007-07-19
  • 打赏
  • 举报
回复
~Base()
{
delete name;
}
多个单元要delete []
char * copyName()
{
char newname [256];
strcpy(newname, name);
return newname;
}

返回已经过期的局部变量~
goodluckyxl 2007-07-19
  • 打赏
  • 举报
回复
Base(char * className)
{
name = new char[strlen(className)];
strcpy(name, className);
}
第一个构造函数就没有对参数做NULL检测


Base(char * className)
{
name = new char[strlen(className)];
strcpy(name, className);
}
这里局部生命周期函数内部的地址也返回 很危险

我啃 2007-07-19
  • 打赏
  • 举报
回复
初看之下就知道安全性很差,而且错误很多~
我啃 2007-07-19
  • 打赏
  • 举报
回复
没有兴趣模拟编译器~

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧