V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JustSong
V2EX  ›  程序员

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

  •  
  •   JustSong ·
    songquanpeng · 2020-04-28 13:08:35 +08:00 · 1698 次点击
    这是一个创建于 1675 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    问题是这样的,我正在写一个文件系统模拟器,允许使用 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 确实被修改了:

    Q_@O4WKA__9OMLY0H3YL4.png

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

    _07T_78N9M__4_IKHH__Y`X.png

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

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

    复现方法

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

    希望大家能帮忙看一下

    11 条回复    2020-04-29 08:59:42 +08:00
    wslzy007
        1
    wslzy007  
       2020-04-28 13:15:53 +08:00   ❤️ 2
    看地址 Filesystem 对象不是一个吧
    geelaw
        2
    geelaw  
       2020-04-28 13:16:44 +08:00 via iPhone   ❤️ 1
    Filesystem 会复制到 execute 里面,自然不会对外面的对象产生影响
    misdake
        3
    misdake  
       2020-04-28 13:18:45 +08:00   ❤️ 1
    Sheel.h 里 execute 函数第一个参数 Filesystem fs,复制进来的,所以每次都是 main 里面那个 fs 的复制
    clayyj1210
        4
    clayyj1210  
       2020-04-28 13:19:06 +08:00   ❤️ 1
    #1 破案了。
    wslzy007
        5
    wslzy007  
       2020-04-28 13:20:23 +08:00   ❤️ 1
    介绍一下 0x64fd10 和 0x64fdc0,如果是对象复制,需要拷贝构造函数哦。
    towry
        6
    towry  
       2020-04-28 13:20:25 +08:00   ❤️ 1
    this 地址都不一样了?
    JustSong
        7
    JustSong  
    OP
       2020-04-28 13:21:20 +08:00
    谢谢大家,之前搞了好久,没注意到地址变了
    JustSong
        8
    JustSong  
    OP
       2020-04-28 13:22:30 +08:00
    但是我之前也有在构造函数处打断点,没被触发
    codehz
        9
    codehz  
       2020-04-28 17:58:50 +08:00 via Android   ❤️ 1
    @JustSong 大概是自动生成的复制构造函数
    建议这种情况直接设定复制构造函数为 delete 阻止意外复制
    (还有 opertor =
    Wirbelwind
        10
    Wirbelwind  
       2020-04-28 22:07:24 +08:00
    同意 #9
    twoconk
        11
    twoconk  
       2020-04-29 08:59:42 +08:00
    呃呃 不是一个对象
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:53 · PVG 22:53 · LAX 06:53 · JFK 09:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.