gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:07:22 25 4
gpt4 key购买 nike

我在我的项目中遇到过同样的情况。
类似地转载了以下代码。

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

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

添加:感谢 mystical 我以同样的方式解决了这个问题。但是这个解决方案也可以。

    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() 函数中:

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 变成了第一种情况下的悬垂指针。

关于c++ - visual studio 2008 sp1 std::string::c_str() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7950270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com