遇到了一个玄学问题, C++ 修改类的数据成员后其值又自己变了回去

2020-04-28 13:08:35 +08:00
 JustSong

问题描述

问题是这样的,我正在写一个文件系统模拟器,允许使用 cd 命令修改当前的工作目录,为此我添加了一个私有的名称为 workingDir 的 string 类型的数据成员,并有两个相关的函数:

bool Filesystem::changeWorkingDir(const string &path) {
    if (!existPath(path)) {
        cerr << "cd: No such directory " << path << endl;
        return false;
    }
    workingDir = path;
    return true;
}

string Filesystem::getWorkingDir() {
    return workingDir;
}

但是出现了一个很玄学的问题,每当我调用 changeWorkingDir 函数修改 workingDir 后它自动的变为初始值。

如下图所示,workingDir 确实被修改了:

但是马上就又变了回去。。

程序中除了这两个函数,就只有构造函数和另外一个函数访问了 workingDir:

Filesystem::Filesystem() {
    fsFilename = "data";
    workingDir = "/";
    // 略
}

bool Filesystem::list(string &path) {
    if (path.empty()) path = workingDir;
    // 略
}


复现方法

编译好程序后,输入 mkdir home 随便创建一个文件夹,使用 cd home 修改工作目录,之后使用 pwd 打印工作目录发现其值依然是之前构造函数中初始化时给赋的值,即 "/"。

希望大家能帮忙看一下

1638 次点击
所在节点    程序员
11 条回复
wslzy007
2020-04-28 13:15:53 +08:00
看地址 Filesystem 对象不是一个吧
geelaw
2020-04-28 13:16:44 +08:00
Filesystem 会复制到 execute 里面,自然不会对外面的对象产生影响
misdake
2020-04-28 13:18:45 +08:00
Sheel.h 里 execute 函数第一个参数 Filesystem fs,复制进来的,所以每次都是 main 里面那个 fs 的复制
clayyj1210
2020-04-28 13:19:06 +08:00
#1 破案了。
wslzy007
2020-04-28 13:20:23 +08:00
介绍一下 0x64fd10 和 0x64fdc0,如果是对象复制,需要拷贝构造函数哦。
towry
2020-04-28 13:20:25 +08:00
this 地址都不一样了?
JustSong
2020-04-28 13:21:20 +08:00
谢谢大家,之前搞了好久,没注意到地址变了
JustSong
2020-04-28 13:22:30 +08:00
但是我之前也有在构造函数处打断点,没被触发
codehz
2020-04-28 17:58:50 +08:00
@JustSong 大概是自动生成的复制构造函数
建议这种情况直接设定复制构造函数为 delete 阻止意外复制
(还有 opertor =
Wirbelwind
2020-04-28 22:07:24 +08:00
同意 #9
twoconk
2020-04-29 08:59:42 +08:00
呃呃 不是一个对象

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666893

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX