【发布时间】:2018-12-26 04:46:59
【问题描述】:
我需要遍历一个包含我自己定义的类型的内存区域:
struct ModuleList
{
char ModuleName[64];
int32_t NumberOfFunctions;
};
struct FunctionList
{
char FunctionName[64];
DWORD FunctionAddress;
};
这些在内存中的布局如下:
0: ModuleList[0]
0 + sizeof(ModuleList): FunctionsList[NumberOfFunctions]
0 + sizeof(ModuleList)+ NumberOfFunctions * sizeof(FunctionList): ModuleList[1]
.
.
.
我想要做的是,为 ModuleList* 重载运算符 ++,这样我就可以轻松正确地增加我的指针,因为指针的默认 ++ 运算符只增加 sizeof(ModuleList) 而我想增加 sizeof(ModuleList)和函数的大小(即 NumberOfFunctions * sizeof(FunctionList))。内存中的这些结构是完全动态的,我的程序通过网络获取。 目前,我正在这样做:
unsigned short ModuleCount = 0;
BYTE* pTemp = (BYTE*)MemoryAdr;
for (; std::string(((ModuleList*)(pTemp))->ModuleName).find(".dll") != std::string::npos; pTemp += ModuleListSize + ((ModuleList*)(pTemp))->NumberOfFunctions * FunctionListSize)
ModuleCount++;
但我认为它看起来很丑。有什么建议吗?
【问题讨论】:
-
您不能为原始指针重载运算符 - 您必须创建一个智能指针类。
-
我不打算粉饰这一点:重载自定义指针别名的增量运算符会以某种方式为您的代码带来 clarity?我们如何老派它并在循环中遍历结构,记录您在此过程中实际所做的事情,而不是试图滥用一个不会做任何事情但进一步混淆代码的功能(如果它有效,它不会)。
-
您可以通过添加
void next()或类似于ModuleList的方法来提高可读性,并在您的循环中调用它 -
使用单个指针(智能或原始指针)迭代异构内容没有意义。
-
部分,我认为问题在于术语。如果你称它为迭代器,那么我们都会很高兴。迭代器是一个可以在某些方面像指针一样使用的对象,如果你遵循这种模式,我认为你可以以合理的清晰度做你想做的事。
标签: c++