visual studio 2008 sp1 std::string::c_str() err
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);
}
}
问题是//问题点
c_str()的返回地址不能赋给const char* ccs。
在调试器中,css为c_str()的返回值分配内存地址,但css的值是",它的工作方式与"相同
,但下一个代码按预期工作。
string str("ok");
const char* ckk = str.c_str();
代码之后,ckk指向str.c_str()返回地址之后,并且ckk在调试器中的值为"ok"
同样的问题发生在std::wstring, wchar_t, unicode中。
为什么会出现这个问题?
谁知道呢?请帮帮我~
添加:多亏了神秘,我用同样的方法解决了这个问题。但这个解决方案也可以。
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()的返回值是活的,直到循环}关闭。
但有趣的是,下一个是don't work
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()
函数中:
string getName()
{
return name;
}
返回的字符串是原字符串的副本。在下面的表达式中,它变成了一个中间体:
const char* ccs = p.m_arg[i]->getName().c_str();
当表达式结束时,中间体被销毁。因此,c_str()
返回的指针无效。结果是ccs
变成了一个悬空指针
运行的原因:
string str("ok");
const char* ckk = str.c_str();
是因为str
不是中间体。
要使其工作,将循环更改为:
for(int i = 0 ; i < (int)p.m_arg.size() ; ++i)
{
string str = p.m_arg[i]->getName()
const char* ccs = str.c_str();
size_t ss = strlen(ccs);
}
编辑:回答你的新问题:
不工作的原因:
string* strr = &p.m_arg[i]->getName();
和前面一样。getName()
返回中间值。然后将其地址分配给strr
。中间体在语句之后被销毁,因此strr
与第一种情况一样成为悬空指针。
相关文章:
- Python str to C++ to Python str
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 字符串变量,比如说"字符串str",可以直接复制到数组中吗?
- 解释一下 for (char c : str) 的作用?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- Getline(cin,str)的奇怪输出
- 比使用 s.str().c_str() 更好的表达?
- 除以 str.length() 什么也没显示
- 没有'str'成员在 GCC 和 Clang 'std::basic_ostream<char>',但 MSVC 没有问题
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- C6001:使用单元化内存"str[i]"
- 而(getline(fin,str)){}即使在到达eof之后仍在处理数据
- 在给定的代码中,有人可以解释一下(int i = 0; i<len; i++)count[str[i]]++的代码片段;
- 在函数内部传递字符 *str
- rdbuf()->str()在哪里?
- std::smatch str() 未返回正确的字符串
- 这是 boost::filesystem 中的错误吗?为什么 boost::filesystem::p ath::str
- STR这个实现是否安全且可移植?
- 编译 C++ AMQP-CPP 演示程序 Err,Make Err