C++ 实例地址更改

C++ Instance's address change

本文关键字:地址 实例 C++      更新时间:2023-10-16

我做了一个dirlist类,以获取特定dir中的所有dir,文件列表。以下是dirlist代码。

class DirList {
private:
    std::string dir_path_;
    int type_;
    DIR *dir_;
public:
    DirList(std::string dir_path);
    DirList(std::string dir_path, int type);
    ~DirList();
    std::string GetNext();
};
DirList::DirList(std::string dir_path) {
    DirList(dir_path, 0);
}
DirList::DirList(std::string dir_path, int type) {
    dir_path_ = dir_path;
    type_ = type;
    dir_ = opendir(dir_path_.c_str());
    if (dir_ == NULL)
        std::cout << "DirList - opendir error - " << dir_path_;
    Logger(Logger::kError) << "path " << dir_path_ << " type " << type_;
    Logger(Logger::kError) << "address " << (uint64_t)this;
}
DirList::~DirList() {
    if (closedir(dir_) != 0)
        std::cout << "DirList - close error - " << dir_path_;
}
std::string DirList::GetNext() {
    Logger(Logger::kError) << "path " << dir_path_ << " type " << type_;
    Logger(Logger::kError) << "address " << (uint64_t)this;
    if (dir_ == NULL) {
        std::cout << "DirList - opendir error - " << dir_path_;
        return "";
    }
    dirent *dirent;
    if(type_ == 0){
        while ((dirent = readdir(dir_)) != NULL) {
            // Jump current and upper dir
            if (dirent->d_name[0] == '.')
                continue;
            else
                break;
        }
    }
    else{
        while ((dirent = readdir(dir_)) != NULL) {
            // Jump current and upper dir
            if ((dirent->d_name[0] == '.') || (dirent->d_type != type_))
                continue;
            else
                break;
        }
    }
    if (dirent == NULL)
        return "";
    return dirent->d_name;
}

dirlist类的使用如下

// main() in main.cc
DirList dir_list(host_proc_path, DT_DIR); 
std::string pid;
while (!(pid = dir_list.GetNext()).empty()){
   ... // this working well.
}
// Parsing() Method in host_parser.cc - host_parser is class to get hostinfo.
DirList dir_list_nic(kSysNetPath);
std::string net_iface;
while (!(net_iface = dir_list_nic.GetNext()).empty()) {
   ... // this is'n't wokring. dir_path_ and type_ has wrong value.
}

dirlist在构造函数中的此地址和getNext方法中的此地址中的某个代码中运行良好。但是,当此地址不同时,dirlist不会在某些代码中扭动...所以dir_path_,type_的值错误。

我了解了为什么更改实例的地址。我不使用新的。

来分配内存。

我的Devel Env是Ubuntu 17.10 64bit和Clang- 3.8。但是我尝试了Ubuntu 16.04 64bit,Clang- 4.0。clang- 5.0 ...但是发生了同样的问题。

谢谢

我找到了原因

DirList::DirList(std::string dir_path) { DirList(dir_path, 0); }

'dirlist(dir_path,0('不是启动此实例。它仅制作临时实例。

解决此问题 DirList::DirList(std::string dir_path) : DirList(dir_path, 0) {}