首页 > 试题广场 >

指出下面程序哪里可能有问题?

[不定项选择题]

指出下面程序哪里可能有问题?

class CBuffer
{
    char * m_pBuffer;
    int m_size;
public:
    CBuffer()
    {
        m_pBuffer=NULL;
    }
    ~CBuffer()
    {
        Free();
    }
    void Allocte(int size)    // (1)
    {
        m_size=size;
        m_pBuffer= new char[size];
    }
private:
    void Free()
    {
        if(m_pBuffer!=NULL) // (2)
        {
            delete[] m_pBuffer;
            m_pBuffer=NULL;
        }
    }
public:
    void SaveString(const char* pText) const // (3)
    {
        strcpy(m_pBuffer, pText); // (4)
    }
    char* GetBuffer() const
    {
        return m_pBuffer;
    }
};
int main (int argc, char* argv[])
{
    CBuffer buffer1;
    buffer1.SaveString("Microsoft");
    printf(buffer1.GetBuffer());
    return 0;
}
  • 1
  • 2
  • 3
  • 4
正确答案应该为: A C D
理由: (1) 分配内存时, 未检测m_pBuffer是否为空, 容易造成内存泄露;
         (3) 常成员函数不应该对数据成员做出修改, 虽然可以修改指针数据成员指向的数据, 但原则上不应该这么做;
         (4) 字符串拷贝时, 未检测是否有足够空间, 可能造成程序崩溃。

发表于 2015-10-03 20:03:53 回复(16)
关于const函数的一些内容:
    c++的const函数特点:

1. 不能在const函数中修改所在类的对象的数据,因为const函数中的*this是常量,同样只能访问const函数;

2. const函数中只能调用其他的const函数,不能调用非const函数,因为对象调用函数是需要传递对象自己,const函数中的*this是常量,非const函数中的*this是变量,因此不可以调用(除非去除*this的const属性);

Note:使用const_cast后,可以在const函数中调用非const函数的

3. const函数与同名的非const函数是重载函数;

4. const对象只能调用const函数 ,但是非const对象可以调用const函数。

发表于 2015-08-12 21:55:27 回复(1)

答:改正后

主要改正SaveString函数

void
SaveString(const char* pText) const
{
strcpy(m_pBuffer,
pText);
}

改为

void
SaveString(const char* pText)(1)
{
Allocte(strlen(pText)+1);(2)
strcpy(m_pBuffer,
pText);
}

原因:

(1)const成员函数表示不会修改数据成员,而SaveString做不到,去掉const声明

(2)m_pBuffer指向NULL,必须用Allocte分配空间才能赋值。

(3)另外需要将Allocte成员函数声明为私有成员函数更符合实际

编辑于 2016-06-19 11:19:59 回复(5)
A,C,D都是错误的。
A:未判断size是否大于0,m_pBuffer是否已经分配内存。
C:const成员函数不能改变成员变量的值,将const关键词去掉即可。
D:strcpy(m_pBuffer,pText),既没有判断m_pBuffer是否不为空,也没有判断其大小,直接strcpy可能会出错。
发表于 2017-01-16 21:09:15 回复(0)
(2)中的 delete m_pBuffer;不应该改为deletep[] m_pBuffer;么?
发表于 2015-08-19 09:21:48 回复(3)
这种题目真没意思,“哪里可能有问题”指的是这一行呢,还是这个函数呢
发表于 2019-05-28 13:48:48 回复(0)
D_L头像 D_L
(1) 不应该也有问题么?

void Allocte(int size);

参数类型 int 是有符号的,也就是说可以传入 负数,,,,这难道不是问题么???!
发表于 2016-06-03 19:11:15 回复(0)
按我说都错误,这题目有问题。首先记住char *m_pBuffer本身只是地址,若加const修饰,地址不变但可以修改内容!不过会造成迷途指针,但有m_size又怕什么?
(1)只顾着申请空间,但原本不为空要首先释放空间。除非调用前先手动释放,比如delete [] buffer1.GetBuffer().
(2)如果此处是(1)中手动释放的,那么这个是迷途指针,应该要判断m_size;再者,私有成员只有析构函数才能调用;释放完没有把m_size置0.
(3)设置为const,则不能修改m_pBuffer,但其内容可以修改,比如在调用前首先申请足额空间,然后拷贝string并不会有问题,buffer1.Allocte(strlen("Microsoft")+1); buffer1.SaveString("Microsoft");但如果此处要调用Allocte或手动申请空间就会出现问题
(4)直接拷贝没有检测地址是否为NULL,空间大小是否够用。同样的,如果按照(3)中事先手动申请空间,那也不会有问题。
总之,这个类有各种问题,但是,如果是定义类的本人去使用,照样没有任何问题,就看你怎么调用了!
发表于 2015-09-17 11:07:48 回复(1)
成功避开了所有正确选项
发表于 2017-06-15 18:33:09 回复(1)
正确答案应该为: A C D
理由: (1) 分配内存时, 未检测m_pBuffer是否为空, 容易造成内存泄露;
         (3) 常成员函数不应该对数据成员做出修改, 虽然可以修改指针数据成员指向的数据, 但原则上不应该这么做;
         (4) 字符串拷贝时, 未检测是否有足够空间, 可能造成程序崩溃。
发表于 2016-10-10 15:15:51 回复(0)
1处其实也没有对size参数进行合法性验证。
3处不能将函数设为const,因为函数体中对变量进行了修改。
4处没有对m_pBuffer是否分配空间进行验证。
发表于 2015-08-08 10:47:44 回复(0)
A. 在void Allocate(int size)函数中,没有进行内存分配前的空指针检查。如果使用该函数之前没有调用Allocate或者调用Allocate时传入了 0 或负数作为参数,那么在后续的代码中访问m_pBuffer将导致未定义行为。可以通过添加对size的合法性检查来避免这个问题。

C.const函数中只能调用其他的const函数
D. 在void SaveString(const char* pText) const函数中,将pText复制到m_pBuffer时使用了strcpy函数。然而,没有检查m_pBuffer是否为 NULL,且没有确保m_pBuffer有足够的空间来存储输入的字符串。如果m_pBuffer为 NULL 或者长度不足以容纳pText,将导致缓冲区溢出。可以使用更安全的字符串复制函数(例如strncpy)并确保分配的缓冲区大小足够来解决这个问题。


编辑于 2023-11-30 19:32:26 回复(0)
正确答案应该为: A C D 理由: (1) 分配内存时, 未检测m_pBuffer是否为空, 容易造成内存泄露;          (3) 常成员函数不应该对数据成员做出修改, 虽然可以修改指针数据成员指向的数据, 但原则上不应该这么做;          (4) 字符串拷贝时, 未检测是否有足够空间, 可能造成程序崩溃。
发表于 2017-06-25 17:54:41 回复(0)
1 分配内存时候没有对m_pBuffer进行判空,容易造成内存泄露。
3 常成员函数不应该对数据成员做修改。
4 字符串拷贝时, 未检测是否有足够空间, 可能造成程序崩溃。
发表于 2022-07-15 14:42:29 回复(0)
我尼马,只选了个B
发表于 2020-12-01 17:26:32 回复(0)
2, m_size不应该设置为0吗?
发表于 2018-06-03 12:20:53 回复(0)
微软的题都不带提示人多选的啊。。。
发表于 2017-05-22 08:34:55 回复(0)
3说自己不会修改数据成员,结果还修改了,还来一句:臣妾做不到啊。。。这要不出问题,还说啥呢是吧
发表于 2016-11-15 20:59:57 回复(0)
讲道理的话全错
发表于 2016-06-15 00:27:06 回复(0)
原来这个题不是说有几个地方有问题,理解有误。。。
发表于 2016-06-11 09:56:46 回复(0)