c++笔试问题
#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;
}
[解决办法]
还有一处比较隐蔽的错误
static void print(Base base);改为
static void print(Base &base);
//不然也会内存泄漏,因为默认基类拷贝构造函数是不正确。
[解决办法]
#include <iostream>
#include <string>
#include <vector>
#include <bitset>
#include <sstream>
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.
*/
class Base
{
private:
char * name;
public:
Base(char * className)
{
name=new char[strlen(className)+1];//错误1
strcpy(name, className);
}
virtual ~Base() //错误2
{
delete []name;
}
char * copyName()
{
char *newname=new char[256];//错误3
strcpy(newname, name);
return newname;
}
virtual char * getName()
{
return name;
}
static void print(Base &base) //错误4
{
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());
char *p=pBase-> copyName(); //错误5
printf( "new name: %s\n ", p);
delete pBase;//错误6
delete []p;
return 0;
}
[解决办法]
#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)]; //少了一个字节,改为name = new char
strcpy(name, className); // [strlen(className)+1];
}
~Base() //要用虚的析构函数 virtual ~Base()
{
delete name; //改为delete []name;否则内存泄露
}
char * copyName()
{
char newname [256]; //改为char *newname=new char[256];
strcpy(newname, name); //否则返回的是栈内存,要有内存错误
return newname;
}
virtual char * getName() //最好用 virtual const char* getName();防止在外面被
{ //修改
return name;
}
static void print(Base base)
{
printf( "name: %s\n " , base.name); //静态成员函数不能操作非静态的成员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()); //只能调用父类的getName()
printf( "new name: %s\n ", pBase-> copyName()); //copyName()内部返回的指针newname
//没有被接收,导致内部申请的空间无法
return 0; //delete,内存泄露
}