_CrtSetDbgFlag() và kiểm tra memory leak

INT WINAPI GameCode4(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nCmdShow)
{
// Set up checks for memory leaks.
int tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
// always perform a leak check just before app exits.
tmpDbgFlag j= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpDbgFlag);
Logger::Init(“logging.xml”);
g_pApp->m_Options.Init(“PlayerOptions.xml”, lpCmdLine);
DXUTSetCallbackD3D11DeviceAcceptable(GameCodeApp::IsD3D11DeviceAcceptable);
DXUTSetCallbackD3D11DeviceCreated(GameCodeApp::OnD3D11CreateDevice);
DXUTSetCallbackD3D11SwapChainResized(GameCodeApp::OnD3D11ResizedSwapChain);
DXUTSetCallbackD3D11SwapChainReleasing(
GameCodeApp::OnD3D11ReleasingSwapChain );
DXUTSetCallbackD3D11DeviceDestroyed( GameCodeApp::OnD3D11DestroyDevice );
DXUTSetCallbackD3D11FrameRender( GameCodeApp::OnD3D11FrameRender );
// Show the cursor and clip it when in full screen
DXUTSetCursorSettings( true, true );
// Perform application initialization
if (!g_pApp->InitInstance (hInstance, lpCmdLine, 0,
g_pApp->m_Options.m_ScreenSize.x,
g_pApp->m_Options.m_ScreenSize.y))
{
return FALSE;
}
DXUTMainLoop();
DXUTShutdown();

Cho em hỏi là:

int tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);

Dùng để làm gì vậy ạ? Và tại sao phải dùng toán tử |= để kiểm tra memory leak vậy ạ? Em cảm ơn các anh nhiều ạ.

Code này sai rồi, j có được dùng đâu. Pass vào _CrtSetDbgFlag() cái gì thì nó trả về cái đó, rồi thêm flag (bằng phép |=), gọi _CrtSetDbgFlag() để set lại flag mới.

int flag = _CRTDBG_REPORT_FLAG; // Flag đầu luôn phải là _CRTDBG_REPORT_FLAG
flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); // Trả về _CRTDBG_REPORT_FLAG

flag |= _CRTDBG_LEAK_CHECK_DF; // "Thêm" flag _CRTDBG_LEAK_CHECK_DF, lúc này flag sẽ có cả _CRTDBG_REPORT_FLAG và _CRTDBG_LEAK_CHECK_DF
_CrtSetDbgFlag(flag); // Set flag mới 

Thêm flag bằng |= (flag), bớt flag bằng &= ~(flag). Muốn rõ hơn, bạn có thể đọc về thao tác trên bits

1 Like

Dạ kkk. Trong lúc copy hình như code bị sai ạ code nguyên gốc là vậy nè anh

    int tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
// always perform a leak check just before app exits.
tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpDbgFlag);

Mà _CRTDBG_REPORT_FLAG, _CrtSetDbgFlag, _CRTDBG_LEAK_CHECK_DF là những lệch dùng để làm gị vậy anh? Tại sao thêm flag bằng toán tử OR vậy anh? Em cảm ơn anh nhiều nè

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?