返回指针时用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
相关产品推荐
相关产品推荐

