You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

返回指针时用shared_ptr避免内存泄漏是否必要?GB2312转UTF-8代码修改咨询

问题解答

1. 返回指针时是否需要用shared_ptr避免内存泄漏?

  • 不是必须,但非常推荐用智能指针或容器替代裸指针——裸指针很容易因调用者忘记释放内存导致泄漏。
  • 选择优先级:如果不需要共享所有权,unique_ptr比shared_ptr更轻量;如果可以直接返回std::string会更安全,完全无需手动管理内存。
  • 若一定要用shared_ptr,针对数组要注意:C17前需指定default_delete<char[]>作为删除器,C17及以后支持shared_ptr<char[]>,无需手动指定删除器。

2. 替换为shared_ptr的代码修改及C语言实现

C++代码修改(基于shared_ptr)

需要调整函数返回类型为shared_ptr<char>,通过get()方法获取裸指针供memset和WideCharToMultiByte调用,同时修复原代码中memset的字节数错误:

#include <windows.h>
#include <memory>
#include <wchar.h>
#include <iostream>

using namespace std;

// GB2312 to UTF-8
shared_ptr<char> G2U(const char* gb2312)
{
    int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
    // 用unique_ptr自动管理wstr内存,避免手动delete
    unique_ptr<wchar_t[]> wstr(new wchar_t[len + 1]);
    memset(wstr.get(), 0, (len + 1) * sizeof(wchar_t)); // 注意乘sizeof(wchar_t),原代码此处有错误
    MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr.get(), len);
    
    len = WideCharToMultiByte(CP_UTF8, 0, wstr.get(), -1, NULL, 0, NULL, NULL);
    // C++17及以后可简化为shared_ptr<char[]> str(new char[len + 1]);
    shared_ptr<char> str(new char[len + 1], default_delete<char[]>());
    
    memset(str.get(), 0, len + 1);
    WideCharToMultiByte(CP_UTF8, 0, wstr.get(), -1, str.get(), len, NULL, NULL);
    
    return str;
}

C语言实现方法

C语言没有智能指针,只能通过malloc/free手动管理内存,调用者必须记得释放返回的指针:

#include <windows.h>
#include <wchar.h>
#include <stdlib.h>

// GB2312转UTF-8,调用者必须用free释放返回的指针
char* G2U(const char* gb2312)
{
    int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
    wchar_t* wstr = (wchar_t*)malloc((len + 1) * sizeof(wchar_t));
    if (wstr == NULL) return NULL;
    memset(wstr, 0, (len + 1) * sizeof(wchar_t));
    MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
    
    len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
    char* str = (char*)malloc(len + 1);
    if (str == NULL) {
        free(wstr);
        return NULL;
    }
    memset(str, 0, len + 1);
    WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
    
    free(wstr);
    return str;
}

// 使用示例
// char* utf8_str = G2U("测试");
// if (utf8_str) {
//     // 业务逻辑
//     free(utf8_str);
// }

内容的提问来源于stack exchange,提问作者4daJKong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:54:23