gpt4 book ai didi

c++ - std::string 作为成员函数参数的奇怪行为

转载 作者:行者123 更新时间:2023-11-27 22:53:02 26 4
gpt4 key购买 nike

我有一个类:

class MyClass

{
char *filename1;
char *filename2;
public:
void setFilename1(std::string str)
{
filename1 = const_cast<char*>(str.c_str())
}
void setFilename2(std::string str))
{
filename2 = const_cast<char*>(str.c_str())
}
void function()
{
// do semthing
}
void printFilename1()
{
std::cout<<filename1<<std::endl;
}
}

这是我的主要功能:

MyClass *p = new MyClass();
p->setFilename1("first_string");
p->printFilename1();
p->setFilename2("second_string");
p->printFilename1();

输出让我非常惊讶:

first_string

second_string

我发誓我的函数 MyClass::setFilename2 没有拼写错误,我没有设置 filename2 变量两次。

我使用的是 g++ 编译器版本 4.8.4。下面是我如何编译我的类:

g++ -g -O -Wall -fPIC -pthread -std=c++11 -Wno-deprecated-declarations -m64 -I/home/user/root-6.06.00/include -c myClass.cxx

现在,另一个惊喜:当我更改 MyClass::setFilename 函数时:

void setFilename2(char* str))
{
filename2 = str;
}

我得到了预期的输出:

first_string

first_string

执行函数 MyClass::function() 不会更改我的任何字符串的值。

那么这是怎么回事呢?这与我对 C++ 的了解相矛盾。如果一个函数不引用相同的变量并且彼此没有任何关系,那么一个函数如何影响另一个函数?

我想这可能与编译器版本或某些编译器选项有关。但我不知道发生了什么。

编辑:能否请您向我解释一下为什么这段代码的行为如此?

最佳答案

c_str() 返回指向 char 数组的指针,只要 std::string 未被修改,该数组就保持有效;在您的情况下,您调用 c_str()std::string 对象在您的方法返回后立即被销毁(它是从字符串中动态创建的临时对象字面量),因此您有效地存储了指向已释放内存的指针。当您执行 printFileName1 时看到新值的事实只是分配器正在回收之前用于其他字符串的内存位置这一事实的副作用;就标准而言,这都是未定义的行为(您可以预料到悲惨的崩溃)。

正确的做法是直接在你的类中存储一个std::string,它会在你的MyClass实例的整个生命周期内正确地管理它自己的内存.

class MyClass
{
std::string filename1;
std::string filename2;
public:
void setFilename1(std::string str)
{
filename1 = str;
}
void setFilename2(std::string str))
{
filename2 = str;
}
void function()
{
// do semthing
}
void printFilename1()
{
std::cout<<filename1<<std::endl;
}
}

关于c++ - std::string 作为成员函数参数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35670822/

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