Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;windows的内存分配_C++_Windows - Fatal编程技术网

C++ C++;windows的内存分配

C++ C++;windows的内存分配,c++,windows,C++,Windows,所以我通过c/c++第五版阅读Windows,该版本在c11之前发布,因此缺少一些更新的数据类型和方法,但被吹捧为是一本关于Windows的好书 我刚刚学习Windows开发和C++,当我用书中的代码示例来发布与文件操作相关的问题时,我得到了反馈,用Maloc函数分配缓冲区不再是一个好的做法,因为它需要释放内存。我应该使用向量或字符串 没关系。但是Windows自己的数据类型是什么情况?以下是本书中的代码示例: //initialization omitted BOOL bResult = Ge

所以我通过c/c++第五版阅读Windows,该版本在c11之前发布,因此缺少一些更新的数据类型和方法,但被吹捧为是一本关于Windows的好书

我刚刚学习Windows开发和C++,当我用书中的代码示例来发布与文件操作相关的问题时,我得到了反馈,用Maloc函数分配缓冲区不再是一个好的做法,因为它需要释放内存。我应该使用向量或字符串

没关系。但是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 STRUCTURE的向量是正确的做法吗?

win32 api有时使用起来很麻烦,但您可以始终将
std::vector
中的原始字节用作
系统逻辑处理器\u信息

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);
  }
std::向量缓冲区(sizeof(系统逻辑处理器信息));
size\u t buffersize=buffer.size();
系统逻辑处理器信息*ptr
=(系统逻辑处理器信息*)&(缓冲区[0]);
BOOL-bResult=GetLogicalProcessorInformation(ptr和buffersize);
如果(GetLastError()==错误\u缓冲区不足)
{
调整缓冲区大小(buffersize);
ptr=(系统逻辑处理器信息*)和(缓冲区[0]);
bResult=GetLogicalProcessorInformation(ptr和buffersize);
}
请注意,
&(buffer[0])
的值在
buffer.resize(…)之后可能会发生变化
除此之外,我通常不使用win32 api,因此关于如何调用win32的任何错误,您必须自行修复。查看一下,您将看到缓冲区应该是“指向接收系统逻辑处理器信息结构数组的缓冲区的指针。如果函数失败,则此缓冲区的内容未定义。”因此,兹德斯拉夫·沃伊科维奇的答案在这里行不通(正如雷蒙德·陈所指出的)。在这种情况下,您可以使用
std::vector
,然后调用'resize',并将
dwSize/sizeof(系统逻辑处理器信息)
作为参数。这看起来像:

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=系统逻辑处理器信息;
std::向量slpi;
DWORD dwSize=0;
if(!GetLogicalProcessorInformation(slpi.data(),&dwSize))
{
如果(GetLastError()!=错误\u缓冲区不足){/*错误处理*/}
//不是真的需要,但很好,以确保
断言(dwSize%sizeof(SLPI)==0);
slpi.resize(dwSize/sizeof(slpi));
如果(!GetLogicalProcessorInformation(slpi.data(),&dwSize)){/*错误处理*/}
}

就我个人而言,我更愿意将上面的内容封装成一个函数,然后返回
slpi
,这样你就不必每次调用
GetLogicalProcessorInformation

向量时都经历这些复杂的操作了。向量工作得非常好。
bBuffer
的类型是什么?显然是PSYSTEM\u逻辑处理器信息这本书你已经拿到手了。如果是C++书,它将至少分配内存与<代码>新< /Cord>运算符。更好的是,它会使用
std::vector
std::array
@Sesertin:不幸的是,没有好的方法可以做到这一点;您必须将缓冲区分配为字节数组,如果太小,则重新分配,然后自己执行强制转换。当然,您是对的。我完全没有注意到SLPI结构的具体问题,而是集中在一般情况下分配WinAPI结构上,但在本例中,它被破坏了。我已经删除了答案——没有必要让人困惑。