Windows的C ++内存分配

时间:2014-08-10 20:08:23

标签: c++ windows

所以我通过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的向量?

2 个答案:

答案 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时都不需要经历这整个恶作剧。