所以我正在通过在c11之前发布的c / c ++第五版阅读Windows,所以缺less一些较新的数据types和方法,但被吹捧为Windows上的一本好书。
我只是学习Windows开发和c + +,当我用本书的代码示例发布有关文件操作的问题时,我得到的反馈是分配带malloc函数的缓冲区不再是一个好习惯,因为它需要释放内存。 我应该使用vector或string。
那没问题。 但是Windows自己的数据types是怎么样的呢? 这是一本书中的代码示例:
//initialization omitted BOOL bResult = GetLogicalProcessorInformation(pBuffer, &dwSize); if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { _tprintf(TEXT("Impossible to get processor information\n")); return; } pBuffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(dwSize); bResult = GetLogicalProcessorInformation(pBuffer, &dwSize);
对于这种types的查询,是否有比使用malloc分配适当内存量更好的解决scheme?
或者正在声明PROCESOR INFORMATION STRUCTRUEtypes的向量吗?
win32 api有时是一个痛苦的使用,但是你可以把std::vector<char>
的原始字节用作SYSTEM_LOGICAL_PROCESSOR_INFORMATION
:
std::vector<char> buffer(sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)); size_t buffersize = buffer.size(); SYSTEM_LOGICAL_PROCESSOR_INFORMATION *ptr = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION *)&(buffer[0]); BOOL bResult = GetLogicalProcessorInformation(ptr, &buffersize); if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { buffer.resize(buffersize); ptr = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION *)&(buffer[0]); bResult = GetLogicalProcessorInformation(ptr, &buffersize); }
在&(buffer[0])
buffer.resize(...);
之后, &(buffer[0])
可能会改变buffer.resize(...);
除此之外,我通常不使用win32 API,所以如何调用win32的任何错误,你必须修复自己
看一下MSDN文档 ,你会看到缓冲区应该是“一个指向缓冲区的指针,它接收一个SYSTEM_LOGICAL_PROCESSOR_INFORMATION结构数组,如果该函数失败,这个缓冲区的内容是不确定的。 因此,Zdeslav Vojkovic的回答在这里不起作用(正如Raymond Chen指出的那样)。 在这种情况下,你可以使用std::vector<SYSTEM_LOGICAL_PROCESSOR_INFORMATION>
,然后用dwSize / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)
作为参数来调用'resize'。 这看起来像这样:
using SLPI = SYSTEM_LOGICAL_PROCESSOR_INFORMATION; std::vector<SLPI> slpi; DWORD dwSize = 0; if (!GetLogicalProcessorInformation(slpi.data(), &dwSize)) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { /* error handling */ } // Not really necessary, but good to make sure assert(dwSize % sizeof(SLPI) == 0); slpi.resize(dwSize / sizeof(SLPI)); if (!GetLogicalProcessorInformation(slpi.data(), &dwSize)) { /* error handling */ } }
就个人而言,我宁愿把上面的代码包装到一个函数中,只是返回slpi
所以每次你想调用GetLogicalProcessorInformation
都不需要经过这个整个shenanigans。