繁体   English   中英

Windows的C ++内存分配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM