跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 遇到了一个玄学问题, C++ 修改类的数据成员后其值又自己变了回去
未分類
12 5 月 2020

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

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

資深大佬 : JustSong 14

问题描述

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

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

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

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

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

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

复现方法

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

希望大家能帮忙看一下

大佬有話說 (11)

  • 資深大佬 : wslzy007

    看地址 Filesystem 对象不是一个吧

  • 資深大佬 : geelaw

    Filesystem 会复制到 execute 里面,自然不会对外面的对象产生影响

  • 資深大佬 : misdake

    Sheel.h 里 execute 函数第一个参数 Filesystem fs,复制进来的,所以每次都是 main 里面那个 fs 的复制

  • 資深大佬 : clayyj1210

    #1 破案了。

  • 資深大佬 : wslzy007

    介绍一下 0x64fd10 和 0x64fdc0,如果是对象复制,需要拷贝构造函数哦。

  • 資深大佬 : towry

    this 地址都不一样了?

  • 主 資深大佬 : JustSong

    谢谢大家,之前搞了好久,没注意到地址变了

  • 主 資深大佬 : JustSong

    但是我之前也有在构造函数处打断点,没被触发

  • 資深大佬 : codehz

    @JustSong 大概是自动生成的复制构造函数
    建议这种情况直接设定复制构造函数为 delete 阻止意外复制
    (还有 opertor =

  • 資深大佬 : Wirbelwind

    同意 #9

  • 資深大佬 : twoconk

    呃呃 不是一个对象

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具