FAIRYFAR-INTERNAL
 
  FAIRYFAR-INTERNAL  |  SITEMAP  |  ABOUT-ME  |  HOME  
自实现的String用法陷阱

用法错误一:导致的内存泄漏

String有以下c_ptr()接口:

snippet.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是通过引用方式使用的,则可能会导致内存泄漏。

snippet.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()申请的内存无人释放。

用法错误二:越界读

以下代码存在越界读问题。

snippet.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()接口。


打赏作者以资鼓励:
移动端扫码阅读: