【发布时间】:2016-06-10 19:06:40
【问题描述】:
我有一堂课:
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
第二个字符串
我发誓我的函数 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()返回的指针。你的班级应该有一个std::string类型的成员。 -
@CodyGray,谢谢,这是一个很好的观点。但是,如果您发表评论,我怎么能接受您的回答?你能解释一下为什么我的代码现在的行为方式是这样的吗?我预计行 p->setFilename1("first_string"); 之后会发生崩溃,因为我返回的引用不会指向 "first_string",这是一个临时对象。
-
当你发现自己在写
const_cast...你可能做错了什么。
标签: c++ object compilation member undefined-behavior