返回类型 char* 的成员函数返回在 while 循环后包含不同字符串的地址
Member function of return type char* returns address that contains different string after while loop
我的代码逐字读取文本文件中的输入,并为每个标记实例化一个对象。在 while 循环中,当我在 VAR
对象上调用 get_value()
并取消引用它时,我得到了我想要的字符串"foo"
,但在循环之外,我得到了属于STRING
对象的字符串 "HELLO"
.我很确定调用构造函数STRING
是导致问题的原因,但我无法确定问题所在。
STRING
和VAR
都有自己的get_value()
成员功能,它们不是彼此固有的。我什至在VAR
的set_value()
函数中动态分配内存,所以我很确定STRING()
没有改变任何东西。如果我发得太多,请原谅我。
输出
$ ./venom
0x7ffeeb3a02d8
foo
0x7ffeeb3a02f8
0x7ffeeb3a02d8
Hello
Hello
主.cpp
ifstream in("new.vnm");
string s;
STRING *ptr1;
VAR *ptr2;
while(in >> s){
if(s[0] == '"') {
//Address to (H)ello
STRING str(&s[1]);
ptr1 = &str;
//0x7ffeeb3a02f8 -- That's OK
cout << ptr1 << endl;
}
else if((s[0] > 'a' && s[0] < 'z') || (s[0] >'A' && s[0] < 'Z')) {
//Address to (f)oo
VAR var(&s[0]);
ptr2 = &var;
// 0x7ffeeb3a02d8 -- This is OK.
cout << ptr2 << endl;
// Value stored at ptr2 -- Prints foo -- That's OK.
for(int i = 0; ptr2->get_value()[i]; i ++)
cout << ptr2->get_value()[i];
cout << endl;
}
};
// 0x7ffeeb3a02d8 -- That's OK
cout << ptr2 << endl;
// Printing Value stored at ptr2 -- Hello -- This is NOT OK!
for(int i = 0; ptr2->get_value()[i]; i ++)
cout << ptr2->get_value()[i];
cout << endl;
// Printing Value stored at ptr1 -- That's OK.
for(int i = 0; ptr1->get_value()[i]; i ++)
cout << ptr1->get_value()[i];
cout << endl;
瓦尔.cpp
void VAR::set_name(char *name) {
this->name = new char[this->len+1];
for(int i = 0; i < len; i ++)
this->name[i] = name[i];
this->name[this->len+1] = ' ';
};
char *VAR::get_value() const {
return this->name;
};
字符串
.cppchar *STRING::get_value() const {
return this->value;
};
void STRING::set_value(char *str) {
this->value = new char[this->len + 1];
for(int i = 0; i < this->len; i ++)
this->value[i] = str[i];
this->value[this->len + 1] = ' ';
};
new.vnm (文本文件(
foo = "Hello";
ptr2->get_value()
应该指向foo
而不是Hello
。
在循环之外,ptr2
和ptr1
都指向不再存在的对象 - 它们已经被销毁,因为它们的范围更小。这是未定义的行为,是一个严重的错误。在这种情况下,任何事情都可能发生,幸运的是,您的程序只打印而不是您期望的内容,而不仅仅是崩溃。
你正在获取指向本地范围的对象的指针,然后在对象超出范围后取消引用该指针。这是未定义的行为。
本质上你的代码是这样的
VAR *ptr2;
{
VAR var;
ptr2 = &var;
}
ptr2->get_value() // this is invalid because 'var' no longer exists.
相关文章:
- 我可以使用什么来停止循环而不是"返回 0"?
- C++ 写入路径名中包含不需要的空字符的文件
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- C++ Code 在 for 循环期间不会累积变量中的总和,仅提供最终迭代值
- CAFFE转发网络在for循环中不起作用
- 如何在C++中创建 if else 循环而不是多个嵌套?
- 为什么这个 IF 语句在循环内不打印
- 在命名空间内使用函数的循环包含
- 为什么我的 while 循环永远不会在 C++ 中的数字猜测游戏中结束?
- 无法打开包含文件'Graphics.hpp'没有这样的文件或目录,Visual Studio的其他包含不起作用
- 解决C++中 3 个类的循环包含
- 嵌套的循环现在不起作用
- 对于循环计数器不递增
- 循环包含依赖项/转发声明
- 程序在终止循环后不接收输入
- 为什么循环退出不会?
- 标头包含不是 .c 程序所必需的,而是.cpp程序需要的
- 不能使用循环包含转发声明
- 错误:"{"标记之前的预期类名 - 似乎找不到任何循环包含
- 循环包含,如何在不更改类层次结构的情况下解决此问题