C++中修改const char*后如何从函数返回有效const char*
你当前代码的问题在于 (s1+s) 是函数栈上的临时std::string对象,该行代码执行完成后就会被自动销毁,其c_str()返回的内存地址也会随之被回收,所以返回的指针是悬空指针,访问就会出现乱码。
以下是几种符合不同场景的实现方案:
方案1:直接返回std::string(最推荐)
C++场景下优先用std::string处理字符串,完全避免裸指针的内存管理问题:
std::string CheckName(const char* name, int number) { return std::string(name) + std::to_string(number); }
调用时如果需要const char*类型,直接对返回的std::string对象调用c_str()即可,只要这个字符串对象没被销毁,指针就有效。
方案2:用静态缓存返回const char*
如果必须返回const char*类型,且不需要多线程安全、不需要同时保留多次调用的结果,可以用静态变量缓存结果:
const char* CheckName(const char* name, int number) { static std::string res_buf; res_buf = std::string(name) + std::to_string(number); return res_buf.c_str(); }
注意:该实现不是线程安全的,且新的调用会覆盖上一次返回的指针指向的内容
方案3:动态分配内存返回const char*
如果需要返回的指针可以独立生命周期,不受后续调用影响,可以手动分配堆内存:
const char* CheckName(const char* name, int number) { std::string res = std::string(name) + std::to_string(number); char* buf = new char[res.size() + 1]; memcpy(buf, res.c_str(), res.size() + 1); return buf; }
注意:调用方使用完返回的指针后,必须手动执行delete[]释放内存,否则会出现内存泄漏
内容的提问来源于stack exchange,提问作者Ams1901
相关产品推荐
相关产品推荐

