c++ 字符串的一些概念

今天看到《c++ primer》上关于字符串的介绍,才惊讶的发现自己之前的很多观念是错误的,现有项目的一些细节也忽略了

1:释放数组指针记得是使用 delete [] pia,虽然早就知道这一点,但是在项目中有时候还是忘记数组指针的释放方法,很轻易的就使用 delete pia进行指针的释放,造成内存泄露了,对于多维数组pia[][],或者类似形式的int** pia = new int[rows][cols],要进行如下形式的资源释放

for (int i = 0 ;i < rows;i++)
{
delete [] pia[i];
}
delete [] pia;

对于 int *p = new int[num],这种指针一定要清醒的认识到这是数组指针,所以要使用delete []p;进行删除。
同样的像这样的指针

int a =3;
int *p =&a;
delete p;

这样的指针p就不能也不用删除了
另外指针删除要注意的几点是:不能重复删除同一个指针,删除指针时,指针要指向最初创建的指针的地址,对于这点可以参考这篇文章:[url]http://www.cnblogs.com/JCSU/articles/1051729.html[/url]

2:c++中c语言风格的字符串都是以'\0'标志结束的,你创建下面一个数组也是可以的

char c[] = {'c','+','+'};

虽然创建时可以的,但是当调用标准库函数时就会引发无法预知的错误,比如调用strlen(c), c是一个没有null结束的字符串,所以当调用该函数时,系统会从c指向的内存地址开始搜索,直到遇到字符null为止,很明显这是错误的。
同样的使用strcmp,strcat,strncat,strcpy,strncpy也会引发错误。
对于strcpy跟strncpy还有几点要另外注意。strcpy(s1,s2)是将s2复制到s1,要求s1的占用的空间要大于等于s2,同时要保证结束符'\0'的复制。因此如果我们使用strlen获取s2字符长度n用于创建s1时,一定要使得n+1,因为strlen获取的s的长度,并不包括'\0',而s1是要以'\0'结尾的,像下面的最做法才是正确的

const char *from ="abcde";
int len = strlen(from);
char *to = new char[len + 1];
strcpy(to ,from);
//或者是 strncpy(to ,from ,len+1);

如果创建的to数组的大小,小于或者等于len,肯定是错误的,因为from剩下的字符就覆盖到了to数组外的地址去了,可能造成不可预知的错误。值得注意的一点是即使是使用strncpy当s1的长度等于len时,实现结果跟使用strcpy创建len长度的数组是一样的, 虽然表面上s1达到的预期的效果,但是复制过程中from数组的结束符'\0',还是复制到了to以下的空间,造成了内存操作的混乱。

3:关于动态分配的数组的初始化,如果数组元素是类类型,比如string(曾经混淆string是否是类类型),将调用该类的默认构造方法进行初始化,如果元素是基本数据类型,也就是内置类型,则无初始化。

string *s = new string[10]; //调用默认构造方法进行初始化。默认为""
int *i = new int[10]; //没有初始化

另外可以
 int *i = new int[10]();
可以这样使用圆括号进行初始化,该例子被元素初始化为0.
对于const对象的动态数组,数组元素同样也是内置类型的话,就必须使用圆括号进行初始化了。
const  int *i = new cosnt int[10]();

类类型可以不加圆括号,因为他们会默认调用构造方法进行初始化了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值