【问题标题】:Faulty conversion, std::string -> LPCSTR [duplicate]转换错误,std::string -> LPCSTR [重复]
【发布时间】:2016-08-25 15:07:13
【问题描述】:

我有一个函数 Analyze_,它返回一个包含一些信息的 std::string,我 虽然希望它以 LPCSTR 形式出现。 当我像这样使用 c_str() 时,它可以工作并存储我的信息:

std::string s =  myClassInstance.Analyze_();
LPCSTR l      = s.c_str();

但是当我写得更短时,如下所示,我得到一系列'Ỳ's:

LPCSTR l = myClassInstance.Analyze_().c_str();

是在 Analyze_() 之前调用 c_str() 吗?我想这应该是不可能的 因为它是一个函数,而不是一个字符串。

我尝试了其他解决方案,例如直接从生成字符串的字符串流转换并返回,如下所示:

std::stringstream ss;
ss << "Bla blub...\n";
return ss.str().c_str();

但我也有同样的问题。 为什么会这样?

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

    c_str()const char* 返回到std::string 的内部缓冲区。像您在这里所做的那样链接方法调用LPCSTR l = myClassInstance.Analyze_().c_str(); 创建一个临时的std::stringAnalyze() 的返回),然后返回指向该字符串内部缓冲区的指针。然后,字符串被销毁,并且在尝试取消引用时留下一个悬空指针 Undefined Behavior。如果您想使用指向它的缓冲区的指针,只需保存 std::string

    【讨论】:

    • 你更快 ;) 但是作为 TL;DR:当字符串对象不再存在时,不要使用 c_str()-ptr。
    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 2012-07-07
    • 1970-01-01
    • 2013-05-11
    • 2012-12-02
    • 2013-09-10
    • 2012-10-31
    • 2014-09-08
    相关资源
    最近更新 更多