CSDN博客

img jaxiinofea

除虫一则--关于new []/delete[]的误用

发表于2004/9/20 21:25:00  617人阅读

今天看《c陷阱与缺陷》,中间有一段像下面一样,我就敲进去玩玩

#include
#include
using namespace std;

int main()
{
    char* s1 = "s1";
    char* s2 = "s2";
    
    char* r = static_cast(malloc(strlen(s1) + strlen(s2) + 1));
    if (!r)
        {
        cout << "malloc fail/n";
        exit(-1);
        }

    strcpy(r, s1);
    cout << r << endl;
    strcat(r, s2);
    cout << r << endl;
    free(r);
}

这是c的风格,对于立志成为c++程序员的我不由自主地把malloc换成了new,free换成地delete,于是有了这样的代码:
int main()
{
    char* s1 = "s1";
    char* s2 = "s2";
    
    char* r = new char(strlen(s1) + strlen(s2) + 1);
    if (!r)
        {
        cout << "malloc fail/n";
        exit(-1);
        }

    strcpy(r, s1);
    cout << r << endl;
    strcat(r, s2);
    cout << r << endl;
    delete r;
}

跑了一下,恩,如我所料一般,输出为:

s1
s1s2

不知道当时怎么想的,我把:
    cout << r << endl;
改成了:
    cout << "|" << r << "|/n";
哐!非法操作!
怎么回事?找了半天bug,因为非法操作是在打印之后出现的,我就注意到了delete的问题。没加括号呀!new回了一串空间,怎么一下就delete掉呢?找死嘛!
        delete [] r;
还是有问题!从头开始找,过了一阵吧,我终于好象看到了什么
    char* r = new char(strlen(s1) + strlen(s2) + 1);
我怎么这么笨呀!括号里的数值不是要求返回多少个,而是初始值。

bug会潜伏于程序之中,无声无息,但当它跳出来是,就晚了……
语法上的正确并不能排除语义的正确表达,能通过编译,连接不能排除错误(废话)。

总之,打好基础,还要小心编码。

new的用法总结
1. new type(initial_value)
2. new type[block_size]
3. 当然还有一种placement new,暂且不提。

p.s.
今天code reveiw了,下一个程序写什么呢?哈哈,拱猪猪!可我还不会python那,学……

阅读全文
0 0

相关文章推荐

img
取 消
img