C++基础系列:指针移动后delete问题

实现去掉字符串中空格的功能。
其间发现值得注意的几点:
!!以下为错误代码!!

class test4
{
public:
    int main4()
    {
        const char *inbuf = "  a string with space   !     ";
        char *outbuf = new char[50];

        if (inbuf == nullptr || outbuf == nullptr)
            return -1;
        while (*inbuf != '\0')
        {
            if (*inbuf != ' ')
                *outbuf++ = *inbuf;
            inbuf++;
        }
        *outbuf = '\0';

        cout << outbuf << endl;
        delete[] outbuf;
        outbuf = nullptr;
        cout << "end" << endl;
        return 0;
    }
};

!!以上为错误代码!!

在处理过程中,移动了inbuf和outbuf指针指向位置,所以cout并不能输出正确结果。
更关键的是,虽然有char *outbuf = new char[50];,但是在移动了outbuf指向位置后,delete[] outbuf;并不是释放所预期的位置的内存,delete其他未知区域是显然是很危险的。

一种解决方案,设置临时量保存初试位置,然后操作指针,或者临时变量的指针,这里简单叙述下,就把两种方法结合了,实际用任何一种都行:

class test5
{
public:
    int main5()
    {
        const char *inbuf = "  a string with space   !     ";
        char *outbuf = new char[50];
        char *out = outbuf;                 //解1:  保存现场,处理后再还原
        const char *tempinbuf = inbuf;      //解2:  操作临时指针,不改变原指针

        if (tempinbuf == nullptr || outbuf == nullptr)
            return -1;
        while (*tempinbuf != '\0')
        {
            if (*tempinbuf != ' ')
                *outbuf++ = *tempinbuf;
            tempinbuf++;
        }
        *outbuf = '\0';

        outbuf = out;                       //还原
        cout << outbuf << endl;
        delete[] outbuf;
        outbuf = nullptr;

        cout << "end" << endl;
        return 0;
    }
};

另,因为函数是按值传递,所以用函数实现是没有问题的:

class test1
{
public:
    int trimSpace(const char *inbuf, char *outbuf)
    {
        if (inbuf == nullptr || outbuf == nullptr)
            return -1;
        while (*inbuf != '\0')
        {
            if (*inbuf != ' ')
                *outbuf++ = *inbuf;
            inbuf++;
        }
        *outbuf = '\0';
        return 0;
    }
    void main1()
    {
        const char *inbuf = "  a string with space    !    ";
        char *outbuf = new char[100];
        if(trimSpace(inbuf, outbuf) != 0)
            return;
        cout << outbuf << endl;
        delete[] outbuf;
        outbuf = nullptr;
        cout << "end" << endl;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值