首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++笔试有关问题

2012-02-11 
c++笔试问题#includestring.h#includestdio.h/***There resomeseriousissuesinclassBaseandSubclass.*

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,内存泄露
}

热点排行