[英]C++ memory allocation for windows
因此,我正在通过c / c ++第五版阅读Windows,该版本在c11之前发布,因此缺少一些较新的数据类型和方法,但被誉为Windows上的一本好书。
我只是在学习Windows开发和c ++,当我从书中通过代码示例发布与文件操作相关的问题时,我得到的反馈是,使用malloc函数分配缓冲区已不再是一种好习惯,因为它需要释放内存。 我应该改用向量或字符串。
那没问题。 但是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类型的向量?
有时使用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.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)
作为参数来调用“调整大小”。 这看起来像:
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
时都经历整个GetLogicalProcessorInformation
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.