C++ 实例地址更改
C++ Instance's address change
我做了一个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) {}
相关文章:
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 常量类实例的C++内存地址
- c++如何获取模板函数实例的地址
- 类实例的地址是否等于类中唯一元素的地址
- C++ 实例地址更改
- 将新放置到缓冲区后,缓冲区和实例是否具有相同的 void* 地址?
- 字节或整数地址预期,而不是str实例python 3
- 构造函数C++中的类实例内存地址
- 在python ctypes中截断了指向C++自定义类实例的指针地址
- 获取模板类对象的地址将导致模板参数的完全实例化
- 如何在给定设备实例ID的情况下可靠快速地获取网卡的MAC地址
- 创建实例时静态变量的地址
- 没有类实例的类成员的地址
- 通用引用产生具有相同地址的不同实例
- 使LLDB将地址重新解释为指向模板实例化类型对象的指针
- 获取函数模板的地址时隐式实例化
- 跨编译单元的相同函数模板实例化的地址
- 重载运算符 std::ostream& 运算符<<打印实例内存地址
- 在不同地址创建类的新实例
- 当获取一个地址时,模板类型(类/函数)的实例化规则是什么?