我在我的项目中遇到过同样的情况。
下面的代码被类似地转载。
visual studio 2008 sp1 std :: string :: c_str()err
#include <iostream>
#include <vector>
using namespace std;
class METHOD
{
public:
vector<METHOD*> m_arg;
string name;
string getName()
{
return name;
}
METHOD()
{
}
METHOD(string n)
{
name = n;
}
};
class PF : public METHOD
{
public:
PF(){};
};
void main()
{
PF p;
p.m_arg.push_back(new METHOD(string("a")));
p.m_arg.push_back(new METHOD(string("b")));
p.m_arg.push_back(new METHOD(string("c")));
for(int i = 0 ; i < (int)p.m_arg.size() ; ++i)
{
const char* ccs = p.m_arg[i]->getName().c_str(); //PROBLEM POINT
size_t ss = strlen(ccs);
}
}
问题//问题POINT
c_str的返回地址()不能分配给为const char * CCS。
调试器,c_str()的回报CSS分配的内存地址,但CSS的值是‘’,它的工作一样‘’
但接下来的代码工作作为预期。
string str("ok");
const char* ckk = str.c_str();
这个代码后,CKK后点str.c_str() returnning ADDRES,和CKK的调试器的值是 “OK”
同样的问题是发生在std :: wstring,wchar_t,unicode。
为什么会出现此问题?
谁知道?帮我PLZ〜
地址: 感谢神秘我解决问题的方法相同。但是这个解决方案也可以。
for(int i = 0 ; i < (int)p.m_arg.size() ; ++i)
{
string& strr = p.m_arg[i]->getName();
const char* ccs = strr.c_str();
size_t ss = strlen(ccs);
}
,所以我认为的getName()是活的,直到循环}的返回值关闭。
但有趣的是,接下来的就是不工作
for(int i = 0 ; i < (int)p.m_arg.size() ; ++i)
{
string* strr = &p.m_arg[i]->getName();
const char* ccs = strr->c_str();
size_t ss = strlen(ccs);
}
的CSS是“晃来晃去”,也就是STRR“”
我茫然和困惑!
另一个解决方法是让'getName()'返回一个'std :: string const&'(函数本身也应该是'const')。然后表达式是有效的,并且没有涉及的字符串的复制。 – Mat
你也可以更进一步,将它嵌入到'strlen'中。但是循环显然是不完整的,因为'ss'从不使用。 – Mysticial
'strlen'也很可疑; 'std :: string :: size()'是O(1)而不是O(n)。 – MSalters