Предупреждение C6331
Недопустимый параметр: передача MEM_RELEASE и MEM_DECOMMIT в сочетании
*function*
не допускается. Это приводит к сбою этого вызова
Это сообщение указывает, что недопустимый параметр передается VirtualFree
или VirtualFreeEx
. VirtualFree
и VirtualFreeEx
оба отклонить флаги (MEM_RELEASE | MEM_DECOMMIT
) в сочетании. Таким образом, значения MEM_DECOMMIT
и MEM_RELEASE
могут не использоваться вместе в одном вызове.
Замечания
Для вывода и выпуска не требуется выполняться как независимые шаги. Освобождение зафиксированной памяти также приведет к выводу страниц. Кроме того, убедитесь, что возвращаемое значение этой функции не игнорируется.
Имя анализа кода: VirtualFreeInvalidParam1
Пример
Следующий пример кода создает предупреждение C6331:
#include <windows.h>
#define PAGELIMIT 80
DWORD dwPages = 0; // count of pages
DWORD dwPageSize; // page size
VOID fd( VOID )
{
LPVOID lpvBase; // base address of the test memory
BOOL bSuccess;
SYSTEM_INFO sSysInfo; // system information
GetSystemInfo( &sSysInfo );
dwPageSize = sSysInfo.dwPageSize;
// Reserve pages in the process's virtual address space
lpvBase = VirtualAlloc (
NULL, // system selects address
PAGELIMIT*dwPageSize, // size of allocation
MEM_RESERVE,
PAGE_NOACCESS );
if (lpvBase)
{
// code to access memory
}
else
{
return;
}
bSuccess = VirtualFree(lpvBase,
0,
MEM_DECOMMIT | MEM_RELEASE); // warning
// code...
}
Чтобы исправить это предупреждение, не передайте MEM_DECOMMIT
VirtualFree
вызову, как показано в следующем коде:
#include <windows.h>
#define PAGELIMIT 80
DWORD dwPages = 0; // count of pages
DWORD dwPageSize; // page size
VOID f( VOID )
{
LPVOID lpvBase; // base address of the test memory
BOOL bSuccess;
SYSTEM_INFO sSysInfo; // system information
GetSystemInfo( &sSysInfo );
dwPageSize = sSysInfo.dwPageSize;
// Reserve pages in the process's virtual address space
lpvBase = VirtualAlloc (
NULL, // system selects address
PAGELIMIT*dwPageSize, // size of allocation
MEM_RESERVE,
PAGE_NOACCESS );
if (lpvBase)
{
// code to access memory
}
else
{
return;
}
bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);
// code...
}
Использование и free
(и связанных API динамического malloc
выделения памяти) имеет множество ошибок с точки зрения утечки памяти и исключений. Чтобы избежать таких потенциальных утечек, используйте механизмы, предоставляемые стандартной библиотекой C++ (STL). К ним относятся, например, unique_ptr
и контейнеры, такие как.shared_ptr
vector
Дополнительные сведения см. в разделе "Смарт-указатели " и "Стандартная библиотека C++".
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по