所以我通过c / c ++第五版阅读Windows,这是在c11之前发布的,因此缺少一些较新的数据类型和方法,但被吹捧为Windows上的一本好书。
我正在学习Windows开发和c ++,当我用本书中的代码示例发布与文件操作相关的问题时,我得到的反馈是,使用malloc函数分配缓冲区不再是一个好习惯,因为它需要释放memroy 。我应该使用向量或字符串。
没关系。但Windows自己的数据类型是什么情况呢?以下是本书中的代码示例:
//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);
对于这种类型的查询,是否有比使用malloc分配适当内存量更好的解决方案?
或者声明一个类型为PROCESOR INFORMATION STRUCTRUE的向量?
答案 0 :(得分:1)
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(...);
的值可能会发生变化
除此之外,我通常不使用win32 api,所以任何关于如何调用win32的bug,你必须自己修复
答案 1 :(得分:1)
看看MSDN documentation,你会发现缓冲区应该是“指向接收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
时都不需要经历这整个恶作剧。