今天看《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那,学……