Skip to content

Commit

Permalink
Merge pull request #1051 from berryzplus/feature/fix_leakcheck
Browse files Browse the repository at this point in the history
デバッグにVC++のCランタイム機能を活用する
  • Loading branch information
berryzplus authored Sep 22, 2019
2 parents 7471046 + fe33a1c commit 08298ea
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 46 deletions.
50 changes: 24 additions & 26 deletions sakura_core/config/build_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,42 +6,40 @@
//デバッグ検証用:newされた領域をわざと汚す。2007.11.27 kobake
#ifdef FILL_STRANGE_IN_NEW_MEMORY

inline void _fill_new_memory(void* p, size_t nSize, const char* pSrc, size_t nSrcLen)
template <size_t srcCount>
inline void _fill_new_memory(void* ptr, size_t size, const char(&src)[srcCount])
{
char* s = (char*)p;
size_t i;
for (i = 0; i < nSize; i++)
const size_t srcLength = srcCount - 1;
size_t rest = size;
for (auto dst = reinterpret_cast<char*>(ptr); rest;)
{
*s++ = pSrc[i%nSrcLen];
auto unit = std::min(srcLength, rest);
memcpy_s(dst, rest, src, unit);
dst += unit;
rest -= unit;
}
}

void* operator new(size_t nSize)
void* operator new(
size_t const size,
int const block_use,
char const* file_name,
int const line_number
)
{
void* p = ::malloc(nSize);
_fill_new_memory(p, nSize, "n_e_w_!_", 8); //確保されたばかりのメモリ状態は「n_e_w_!_....」となります
auto p = _malloc_dbg(size, block_use, file_name, line_number);
_fill_new_memory(p, size, "n_e_w_!_"); //確保されたばかりのメモリ状態は「n_e_w_!_....」となります
return p;
}

#ifdef _MSC_VER
_Ret_bytecap_(nSize)
#endif

void* operator new[](size_t nSize)
void* operator new[](size_t const size,
int const block_use,
char const* file_name,
int const line_number
)
{
void* p = ::malloc(nSize);
_fill_new_memory(p, nSize, "N_E_W_!_", 8); //確保されたばかりのメモリ状態は「N_E_W_!_N_E_W_!_N_E_W_!_....」となります
auto p = operator new(size, block_use, file_name, line_number);
_fill_new_memory(p, size, "N_E_W_!_"); //確保されたばかりのメモリ状態は「N_E_W_!_N_E_W_!_N_E_W_!_....」となります
return p;
}

void operator delete(void* p) noexcept
{
::free(p);
}

void operator delete[](void* p) noexcept
{
::free(p);
}

#endif
47 changes: 27 additions & 20 deletions sakura_core/config/build_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@ static const bool UNICODE_BOOL=true;
//#define USE_DEBUGMON

//newされた領域をわざと汚すかどうか (デバッグ用)
#ifdef _DEBUG
#if defined(_MSC_VER) && defined(_DEBUG)
#define FILL_STRANGE_IN_NEW_MEMORY
#endif

//crtdbg.hによるメモリーリークチェックを使うかどうか (デバッグ用)
#ifdef _DEBUG
//#define USE_LEAK_CHECK_WITH_CRTDBG
#if defined(_MSC_VER) && defined(_DEBUG)
#define USE_LEAK_CHECK_WITH_CRTDBG
#endif

// -- -- 仕様変更 -- -- //
Expand All @@ -77,28 +77,35 @@ static const bool UNICODE_BOOL=true;

//デバッグ検証用:newされた領域をわざと汚す。2007.11.27 kobake
#ifdef FILL_STRANGE_IN_NEW_MEMORY
void* operator new(size_t nSize);
#ifdef _MSC_VER
_Ret_bytecap_(nSize)
#endif
void* operator new[](size_t nSize);
void operator delete(void* p) noexcept;
void operator delete[](void* p) noexcept;
void* operator new(
size_t const size,
int const block_use,
char const* file_name,
int const line_number
);
void* operator new[](size_t const size,
int const block_use,
char const* file_name,
int const line_number
);
#endif

//crtdbg.hによるメモリーリークチェックを使うかどうか (デバッグ用)
#ifdef USE_LEAK_CHECK_WITH_CRTDBG
//new演算子をオーバーライドするヘッダはcrtdbg.hの前にincludeしないとコンパイルエラーとなる
//参考:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=99818
#include <xiosbase>
#include <xlocale>
#include <xmemory>
#include <xtree>

//Cランタイムの機能を使ってメモリリークを検出する
// メモリリークチェックの結果出力を得るには
// wWinMainの最後で_CrtDumpMemoryLeaks()を呼び出すか
// wWinMainの最初で_CrtSetDbgFlag()を呼び出す必要がある。
//see https://docs.microsoft.com/en-us/visualstudio/debugger/finding-memory-leaks-using-the-crt-library
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
//それと、WinMainの先頭で _CrtSetDbgFlag() を呼ぶ.

#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the
// allocations to be of _CLIENT_BLOCK type
#else
#define DBG_NEW new
#endif

#if _WIN64
Expand Down

0 comments on commit 08298ea

Please sign in to comment.