visual studio 2008 sp1 std::string::c_str() err

visual studio 2008 sp1 std::string::c_str() err

本文关键字:str err string studio 2008 sp1 std visual      更新时间:2023-10-16

我在我的项目中遇到过同样的情况。
下面的代码被类似地复制。

#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
在调试器中,cssc_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与第一种情况一样成为悬空指针。