c++ - 返回类型 char* 的成员函数在 while 循环后返回包含不同字符串的地址
问题描述
我的代码逐字读取文本文件中的输入,并为每个标记实例化一个对象。在 while 循环中,当我调用对象并取消引用它时,我得到了我想要的字符串get_value()
,但在循环之外我得到了属于object的字符串。我很确定调用构造函数是导致问题的原因,但我无法确定问题所在。VAR
"foo"
STRING
"HELLO"
STRING
STRING
并且VAR
有自己的get_value()
成员函数,并且它们不是彼此固有的。我什至在VAR
'sset_value()
函数中动态分配内存,所以我很确定STRING()
没有改变任何东西。请原谅我发的太多了。
输出
$ ./venom
0x7ffeeb3a02d8
foo
0x7ffeeb3a02f8
0x7ffeeb3a02d8
Hello
Hello
主文件
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;
VAR.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] = '\0';
};
char *VAR::get_value() const {
return this->name;
};
字符串.cpp
char *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] = '\0';
};
new.vnm(文本文件)
foo = "Hello";
ptr2->get_value()
应该指向foo
不是Hello
。
解决方案
在循环之外ptr2
和都ptr1
指向不再存在的对象-它们已经被销毁,因为它们的范围更小。这是未定义的行为和严重错误。在这种情况下,任何事情都可能发生,而且很幸运,您的程序只打印出您所期望的,而不是崩溃。
推荐阅读
- ios - 朝弓面对的方向射箭
- python - 将数组分解为组件数组
- selenium-webdriver - 机器人未检测到 Web 元素
- android - 如何获取图像视图的触摸点
- meteor - 在我的应用程序中运行流星会引发错误:ENOENT:没有这样的文件或目录
- javascript - 有没有办法使用函数的参数来使用点符号定位对象中的项目?
- javascript - Javascript var在计算中不起作用
- sql-server - 根据插入的 scope_identity() 在 SQL Server 中设置列的值
- algorithm - 计算最佳情况、平均情况和最坏情况的算法复杂度
- html - HTML 附件仅对使用 Outlook 应用程序(非默认邮件应用程序)的 iPhone 用户变为纯文本