我有这个函数获得3个输入(主要是LPCSTR)并将它们组合在一起并最终返回值:
template<typename T>
inline T const& LPCombine(T const& lpStr1, T const& lpStr2, T const& lpStr3)
{
std::string str1, str2, str3, Combined;
LPCSTR lpCombiend = "";
str1 = lpStr1;
str2 = lpStr2;
str3 = lpStr3;
Combined = str1 + str2 + str3;
lpCombiend = Combined.c_str();
return lpCombiend;
}
如果我在同一个函数中打印lpCombined
的值是正确的,字符串或数字连接得那么好但是如果我从另一个函数打印LPCombine
函数的返回值,如 main 功能打印的值是奇怪且不可读的东西:
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
有什么问题?
答案 0 :(得分:2)
在退出LPCombine功能时销毁合并。因此,LPCombine返回指向已释放内存的指针,并且您有意外行为。也许你需要从函数返回std :: string(使用std :: string作为输入参数)。
答案 1 :(得分:1)
当T == LPCSTR
,即const char*
时,您的函数会返回对原始char
指针的const引用。
主要问题是此指针指向函数体中定义的 std::string
对象(Combined
)的内存:
std::string ..., Combined; ... lpCombiend = Combined.c_str(); return lpCombiend;
(请注意,您似乎有拼写错误,lpCombiend
应为lpCombined
。)
当函数终止时,Combined
std::string
对象被销毁,因此lpCombiend
指针指向垃圾。
特别是,在调试版本中使用Visual C ++时,未初始化的内存标有0xCC
个字节序列。请注意,0xCC是ASCII代码204 = ╠
(框图绘制字符双向垂直和右边),这正是输出中的内容。
因此,您应该考虑返回std::string
对象。
我还会质疑模板功能的声明和设计。拥有const T&
输入字符串参数真的有意义吗?如果是T
,例如PCWSTR
(const wchar_t*
),您的函数正文中的str1 = lpStr1;
作业将无效,因为str1
是std::string
,您无法创建来自std::string
原始指针的const wchar_t*
。