在改变c字符串时避免内存泄漏

msi*_*msi 3 c++ connection-string memory-management cstring

出于教育目的,我在一些测试程序中使用cstrings.我想用占位符缩短字符串,例如"......".

也就是说,如果我的最大长度设置为13 ,"Quite a long string"则会变为"Quite a lo..."13.此外,我不想破坏原始字符串 - 因此缩短的字符串必须是副本.

下面的(静态)方法是我提出的.我的问题是:为类缩短的字符串分配内存的类是否也应该负责释放它? 我现在所做的是将返回的字符串存储在单独的"用户类"中,并将内存释放到该用户类.

const char* TextHelper::shortenWithPlaceholder(const char* text, size_t newSize) {
    char* shortened = new char[newSize+1];

    if (newSize <= 3) {
        strncpy_s(shortened, newSize+1, ".", newSize);
    }
    else {
        strncpy_s(shortened, newSize+1, text, newSize-3);
        strncat_s(shortened, newSize+1, "...", 3);  
    }
    return shortened;
}
Run Code Online (Sandbox Code Playgroud)

BJ *_*mer 6

像这样的函数的标准方法是让用户传入char []缓冲区.您可以在函数中看到这一点sprintf(),例如,将目标缓冲区作为参数.这允许调用者负责分配和释放内存,将整个内存管理问题保存在一个地方.


vog*_*vog 5

为了避免缓冲区溢出和内存泄漏,您应该始终使用C++类,例如std::string在这种情况下.

只有最后一个实例才能将类转换为低级别,例如char*.这将使您的代码简单而安全.只需将您的代码更改为:

std::string TextHelper::shortenWithPlaceholder(const std::string& text,
                                               size_t newSize) {
    return text.substr(0, newSize-3) + "...";
}
Run Code Online (Sandbox Code Playgroud)

在C上下文中使用该函数时,只需使用以下cstr()方法:

some_c_function(shortenWithPlaceholder("abcde", 4).c_str());
Run Code Online (Sandbox Code Playgroud)

就这样!

通常,您不应该像在C中编程一样使用C++编程.将C++视为一种非常不同的语言更为合适.