# 用法错误一:导致的内存泄漏 String有以下c\_ptr()接口: ```cpp class String { char *Ptr; uint32 str_length,Alloced_length; bool alloced; public: inline char *c_ptr() { if (!Ptr || Ptr[str_length]) /* Should be safe */ (void) realloc(str_length); //可能给Ptr分配内存 return Ptr; } }; ``` 如果某个String对象的Ptr是通过引用方式使用的,则可能会导致内存泄漏。 ```cpp class Parameter_group_concat { public: String *separator; bool operator == (const Parameter_group_concat &source) { if( source.separator != separator ){ // … … if(memcmp(separator->c_ptr(), source.separator->c_ptr(), separator->length() ) != 0 ) return false; } } }; // 以上c_ptr()调用为separator的Ptr分配了内存,但是separator是由上层的yacc传递下来的,,yacc有自己的内存管理池,不会去删除separator的Ptr空间。导致此处c_ptr()申请的内存无人释放。 ``` # 用法错误二:越界读 以下代码存在越界读问题。 ```cpp String str;str.append("1234567"); str.append('8'); std::string exprString = str.c_ptr(); //越界读 ``` bool append(char chr)有个问题:每追加一个字符,str\_length自增1,因此可能会等于Alloced\_length,那么接下来调用String::c\_ptr()会越界读一个字节。 两种修订方法: 1. 修订bool append(char chr); 2. 只有调用了bool append(char chr)接口,后续禁止再调用c_ptr()接口,可以调用const \* char ptr()接口。