visual studio 2008 sp1 std :: string :: c_str()错误

时间:2011-10-31 05:33:05

标签: c++ visual-studio-2008 memory std

我在我的项目中遇到了同样的情况。
以下代码同样复制。

#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中出现同样的问题。

为什么会出现这个问题? 谁知道?帮帮我PLZ~

ADD: 感谢神秘我以同样的方式解决问题。但这个解决方案也可行。

    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是“” 我感到茫然和困惑!

1 个答案:

答案 0 :(得分:4)

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变为悬空指针,如第一种情况。