gpt4 book ai didi

c++ - c_str 返回但缺少第一个字符

转载 作者:行者123 更新时间:2023-11-27 23:12:37 26 4
gpt4 key购买 nike

const char* getOutPath() 
{
return classVarStr.c_str();
}

我有之前的功能,

当我收到返回值时有一些奇怪的东西,

我得到完整路径但不包括第一个字符!

所以如果路径是 results/appName_subStr.dat 我得到 esults/appName_subStr.dat !

我将函数调用更改为

string getOutPath() 
{
return classVarStr;
}

然后我在接收到值后调用 c_str() 以使用第一个 char

获取正确的路径

我猜这可能是因为函数堆栈弹出可能以某种方式修改了地址?

有没有人遇到过类似的问题,可能是什么原因?

编辑:

class X
{
private:
string classVarStr;
public:
X(string in) : classVarStr(in)
const char* getOutPath()
{
return classVarStr.c_str();
}
string getOutPathStr()
{
return classVarStr;
}
}

class B
{
private:
X xinstance;
public:
B(int argc, char * argv[])
{
getSomepathFn(argc, argv);
}

string getAppPath1()
{
return xinstance.getOutPath(); // this create a string then pass a copy, and internally deleted
}
const char * getAppPath2()
{
return xinstance.getOutPathStr().c_str();// this is a problem, create a string, then pass const to the data, and deleted before the function call return, **Undefined behaviour** because the `getOutPathStr()` doesnt return a const reference
}

}

class appObj
{
void printMessage()
{
B obj = getBObj();
FILE *fileptr = fopen(obj->getAppPath2(), "a");// this is the faulty area
}
};

最佳答案

如果您的函数使用具有自动存储持续时间的 std::string,则返回指向其内部存储的指针将产生未定义的行为,因为一旦执行超出范围,对象将自动销毁(实际字符所在的内存也被释放):

const char* getOutPath() 
{
std::string classVarStr;
...
return classVarStr.c_str();
}

这就是为什么返回本地 std::string 对象拷贝(按值)的相同代码按预期工作的原因。


此代码(来自您的编辑):

const char * getAppPath2() 
{
return xinstance.getOutPathStr().c_str();
}

调用按值返回std::string对象的getOutPathStr(),这意味着在getAppPath2()方法内部,有此 std::string 对象的拷贝。但是这个拷贝也只存在于这个范围内,相当于:

const char * getAppPath2() 
{
std::string copy = xinstance.getOutPathStr();
return copy.c_str();
}

这正是我一开始所描述的情况 ~> UB 的原因。

关于c++ - c_str 返回但缺少第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19120299/

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