https://img-blog.csdnimg.cn/32db9ce43ef64316a2e37a31f4cee033.gif
编程小鱼酱yu612.com,点击前往

string 不能使用memset or memcpy


string 不能使用memset或者memcpy 这些低级函数。



string类是C++中专门处理字符串的类,它的实际上是basic_string<char>的一个typedef。它有四个跌代器:
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef _String_iterator<_Elem, _Traits, _Alloc> iterator;//models random iterator
typedef _String_const_iterator<_Elem, _Traits, _Alloc> const_iterator;////models random iterator//models random iterator
一个静态常量:static const size_typed npos = -1;
basic_string模板定义的类型:
typedef    traits                                                         traits_type;        //某个具体类型的模板参数                        
typedef    typename traits::char_type                         value_type;       
typedef   Allocator                                                   allocator_type;
typedef   typename Allocator::size_type                    size_type;
typedef   typename Allocator::difference_type           difference_type; 
typedef   typename Allocator::reference                    reference;
typedef   typename Allocator::const_reference          const_reference;
typedef   typename Allocator::pointer                        pointer;
typedef   typename Allocator::const_pointer              const_pointer;



下面是 memsey 和memcpy的源码

/*******************************************************
 *  memcpy and memset
 *  the same as copy
 *******************************************************/
void * Mymemcpy(void *desStr, const void *srcStr, int n) {    //内存拷贝
    char *s1 = (char *)desStr;
    char *s2 = (char *)srcStr;
    while(n --)
        *s1 ++ = *s2 ++;
    return desStr;
}
void * Mymemset(void *str, char c, int n){        //区域赋值
    char *s = (char *)str;
    while(n --){
        *s ++ = c;
    }
    return str;
}


对于String来说,我们在编辑器加监视,你会发现内部除了字符还有别的东西,所以

new完后string的构造函数已经调用完毕,你再memset就破坏了他的内部数据不变式。




在网上看到这样一条评论,觉得有道理:
任何类都不能用memset, 一旦暴力,就等于你强奸了她的内部数据,她已经崩溃了



































posted @ 2017-03-20 16:58  鱼酱  阅读(250)  评论(0编辑  收藏  举报

https://img-blog.csdnimg.cn/32db9ce43ef64316a2e37a31f4cee033.gif
编程小鱼酱yu612.com,点击前往