Contents:
- 1 °³¿ä
- 2 °ü·Ã¼Àû
- 3 Áֿ丵ũ
- 4 LocalAlloc °ú new ÀÇ Â÷ÀÌ
- 4.1 CBroHeap Ŭ·¡½º ÄÚµå
- 4.2 Ŭ·¡½º¿ë CBroHeap
- 4.3 À̸§ ÀÖ´Â Èü ¸¸µé±â
- 4.4 µÎ Ŭ·¡½º°¡ ÇϳªÀÇ ÈüÀ» ÀÌ¿ëÇϱâ
- 4.5 ÀϹÝÇüÀÇ ÀÚ·áµµ Èü¿¡ »ç¿ëÇϱâ
- 5 ´Ù¿î·Îµå
- 6 °ü·Ã¸µÅ©
4 LocalAlloc °ú new ÀÇ Â÷ÀÌ #
MSDN ÀÇ ÇØ´ç LocalAlloc ¼³¸íÀ» º¸½Ã¸é
Note The local functions are slower than other memory management functions and do not
provide as many features. Therefore, new applications should use the heap functions.
¶ó°í ½áÀÖ°í ±×·¡¼ ºñÃßõÇÑ´Ù´Â ¸»ÀÌ ³ª¿À´Â°Å °°½À´Ï´Ù. ±×¸®°í ¸»¾¸ÇϽŴë·Î new ´Â malloc ¿¡ ÀÇÇØ ±¸ÇöµÇ¾îÀÖ°í Win32 ¿¡¼ÀÇ CRT malloc ÇÔ¼ö´Â ´Ù½Ã return HeapAlloc( _crtheap, 0, size ); ÇÔ¼ö·Î ±¸ÇöµÇ¾ú½À´Ï´Ù. ù ÀÎÀÚÀÎ _crtheap Àº C ·±Å¸ÀÓ¿ë ±âº» default heap À» ÀǹÌÇÕ´Ï´Ù.
LocalAlloc À» ¾²¸é ÀڽŸ¸ÀÇ ¸Þ¸ð¸® Èü¿¡´Ù¸¸ ÇÒ´çÇÏ´Ï Á» ´À·Áµµ ÅëÀÌ ²Ëá´Ù°í ³ª¿ÀÁö ¾Ê¾Ò´Âµ¥ ¹ÝÇØ _crtheap À̶ó´Â Èü¿¡´Ù°¡ ¸ðµÎ ³Ö°Ô µÇ´Ï ¾È±×·¡µµ ´Ù¸¥ ÀϹÝÀûÀÎ new È£Ãâ¿¡µµ _crtheap ±âº»ÈüÀ¸·Î ÇÒ´çµÇ¾î¼ ²ËÂ÷°Ô µÇ´Â »óȲÀÌ ¹ß»ýµÈ µíÇÕ´Ï´Ù.
ÇØ°á ¹æ¹ýÀ¸·Î´Â ±×³É ±âÁ¸ ¼Ò½º¸¦ º¸Á¸Çϰųª (±ÍÂ÷´Ï½ºÆ®Ãßõ) ±»ÀÌ ±âº» ÈüÀ» »ç¿ëÇÏÁö ¾Ê°í ÀڽŸ¸ÀÇ ÈüÀ» »ç¿ëÇØº¸´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. new Çڵ鷯¸¦ ÀçÁ¤ÀÇÇØ¼ ÀڽŸ¸ÀÇ ÈüÀ» »ç¿ëÇØ º¼ ¼ö ÀÖ°Ú°í¿ä. Àú °°Àº °æ¿ì °£´ÜÇÏ°Ô LocalHeap Ŭ·¡½º¸¦ ¸¸µé¾î´Ù°¡ ¾²°ï ÇÕ´Ï´Ù. (¹°·Ð ÀÌ·± ¾ÆÀ̵ð¾îÀÇ Ãâó´Â Advanced Windows NT ¸¦ ¾²½Å Á¦ÇÁ¸®¸®Ã³ ´ÔÀ» ÅëÇØ ¹è¿î°ÍÀ̰í¿ä.)
4.1 CBroHeap Ŭ·¡½º ÄÚµå #
// BroHeap.h: interface for the CBroHeap class.
//
// Bro's Local Heap Helper Class
// by bro ( bro@jiran.com )
// Jo kyung Min.
// 2002-03-28
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_BROHEAP_H__3CB0A950_D6F5_434A_AE15_CF52D59711A5__INCLUDED_)
#define AFX_BROHEAP_H__3CB0A950_D6F5_434A_AE15_CF52D59711A5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//===================================================================
// Ŭ·¡½º : CBroHeap class
// ¼³ ¸í : ·ÎÄà Èü °ü¸®¸¦ Á¦°øÇØÁÖ´Â º£À̽º ÅÛÇø´ Á¤Àû Ŭ·¡½º
// _dwHeapId - »ý¼ºÇÒ Èü°ø°£ÀÇ À̸§ ( µðÆúÆ® : !bro )
//===================================================================
template class CBroHeap
{
static HANDLE ms_hHeap; // Èü ÇÚµé
// Èü¿µ¿ª¿¡¼ »õ·ÎÀÌ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ´Â ÇÔ¼ö
inline static void * Alloc( size_t size )
{
if( !ms_hHeap )
ms_hHeap = HeapCreate( 0, 0, 0 );
if( !ms_hHeap )
return NULL;
return HeapAlloc( ms_hHeap, 0, size );
}
public:
// ÇØ´ç ÁÖ¼Ò°¡ °ü¸®µÇ´Â Èü¿µ¿ª¾È¿¡¼ À¯È¿ÇÑ ÁÖ¼ÒÀÎÁö ÆÇº°ÇÑ´Ù.
static BOOL IsBadPtr( void* p )
{
return HeapValidate( m_hHeap, 0, p );
}
// C++ new/delete overloading
void * operator new( size_t nSize )
{
return Alloc( nSize );
}
inline void * operator new( size_t nSize, LPCSTR lpszFileName, int nLine )
{
return operator new( nSize );
}
void* operator new[]( size_t nSize )
{
return Alloc( nSize );
}
void operator delete( void* p )
{
HeapFree( ms_hHeap, 0, p );
}
inline void operator delete( void* p, LPCSTR lpszFileName, int nLine )
{
operator delete( p );
}
void operator delete[]( void* p )
{
HeapFree( ms_hHeap, 0, p );
}
};
// ÅÛÇø´ Á¤Àû ¸É¹ö º¯¼ö
template HANDLE CBroHeap<_dwHeapId>::ms_hHeap;
//===================================================================
// Ŭ·¡½º : _c
// ¼³ ¸í : ±âº»ÇüÀÚ·á (int, char µî) µµ BroHeap À» ¾µ ¼ö ÀÖµµ·Ï ·¡ÇÎÇÑ
// ÅÛÇø´ ÇïÆÛ Ŭ·¡½º
//===================================================================
template struct _c : public CBroHeap<_dwHeapId>
{
T t;
T* operator &() { return &t; }
operator T() { return t; }
operator T*() { return &t; }
T operator = ( T t2 ) { t = t2; return t; }
};
//===================================================================
// Ŭ·¡½º : _p
// ¼³ ¸í : _c°´Ã¼ÀÇ ¹¬½ÃÀû Æ÷ÀÎÅÍ Ä³½ºÆÃÀ» Áö¿øÇϱâ À§ÇÑ _c °´Ã¼
// Æ÷ÀÎÅÍ ·¡ÆÛ Ŭ·¡½º
//===================================================================
template struct _p
{
typedef _c* _pc;
_pc p;
_p( _pc pc ) { p = (_pc)pc; }
_p( _c c ) { p = (_pc)&c; }
T& operator [] ( int i ) { return p->t; }
operator _pc() { return p; }
_pc operator = (_pc p2) { p = p2; return p; }
operator T*() { return &p->t; }
};
#endif // !defined(AFX_BROHEAP_H__3CB0A950_D6F5_434A_AE15_CF52D59711A5__INCLUDED_)
CBroHeap À» »ó¼Ó¹Þ°í, default process heap new / delete ¾²µíÀÌ ¾²¸é µÈ´Ù.
class CObj : public CBroHeap<>
{
public:
char x[10];
};
:
{
:
CObj * p = new CObj;
delete p;
:
}
4.3 À̸§ ÀÖ´Â Èü ¸¸µé±â #
À̸§¾ø´Â ÈüÀº ±âº»ÀûÀ¸·Î !bro ¶ó´Â À̸§À» °®°ÔµÇ´Â ÈüÀ¸·Î µÈ´Ù. ³ª¸¸ÀÇ À̸§À» °®´Â ÈüÀ» ¸¸µé¾îº»´Ù. DWORD ÀÇ id À̹ǷΠ4 ¹ÙÀÌÆ®ÀÇ ¹®ÀÚ¸¸À» Çã¿ëÇÑ´Ù.
class CObj : public CBroHeap<'mine'>
{
public:
char x[10];
};
:
{
:
CObj * p = new CObj[30];
delete[] p;
:
}
4.4 µÎ Ŭ·¡½º°¡ ÇϳªÀÇ ÈüÀ» ÀÌ¿ëÇϱâ #
´ÜÁö »ó¼ÓÀ» °°Àº id ÀÇ ÈüŬ·¡½º¸¦ »ó¼Ó¹ÞÀ¸¸é µÈ´Ù.
class CObj1 : public CBroHeap<'mine'>
{
public:
char x[10];
};
class CObj2 : public CBroHeap<'mine'>
{
public:
char x[40];
};
// ÀÌÁ¦ CObj1 °ú CObj2 ÀÇ new/delete ´Â ¸ðµÎ °°Àº ÈüÀ» ¾´´Ù.
{
:
CObj1 * p1 = new CObj1;
delete p1;
CObj2 * p2 = new CObj2;
delete p2;
:
}
4.5 ÀϹÝÇüÀÇ ÀÚ·áµµ Èü¿¡ »ç¿ëÇϱâ #
_c ¶ó´Â ÇïÆÛ Ŭ·¡½º¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù.
_c * p = new _c[20];
strcpy( (char*)p, "aaa" ); // ¸í½ÃÀûÀ¸·Î (char*) ¸¦ ÇØÁÖ¾î¾ßÇÑ´Ù.
TRACE( "%s %c",(char*)p, p[0] ); // ¸í½ÃÀûÀ¸·Î (char*) ¸¦ ÇØÁÖ¾î¾ßÇÑ´Ù.
delete p;
¸¸ÀÏ _p ¸¦ ¾²¸é ¸í½ÃÀûÀÎ (char *) ¸¦ ¾ÈÇØÁ൵ µÈ´Ù.
_c* p = new _c[20];
_p* pr( p ); // p ¸¦ ÂüÁ¶ ·¡ÇÎÇÑ pr À» »ý¼ºÇÑ´Ù.
strcpy( pr, "aaa" ); // ¸í½ÃÀûÀ¸·Î (char*) ¸¦ ¾ÈÇØµµ µÈ´Ù.
TRACE( "%s %c",pr, pr[0] ); // ¸í½ÃÀûÀ¸·Î (char*) ¸¦ ¾ÈÇØµµ µÈ´Ù.
delete[] p;
// (°³¼±ÀÇ ¿©Áö°¡ ÀÖ´Ù.)
// ¶Ç´Â delete[] (_c*)pr; Áö¿ï¶§´Â ¸í½ÃÀûÀ¸·Î ÇØÁÖ¾î¾ß ÇÑ´Ù.
// ÀÏ´Ü ¾²´Â µ¿¾È (char*) °°Àº ¸í½ÃÀû ij½ºÆÃÀ» ÇÏ´Â ÄÚµùÀÇ ³ë°í¸¦
// ´ú¾îÁشٴµ¥¿¡ ÀÇÀǸ¦ µÎ°í ÀÖ´Ù. ³ªÁß¿¡´Â delete ¿¡ ´ëÇØ¼µµ
// Æ÷ÀÎÅÍ ·¡ÆÛ Ŭ·¡½º°¡ Á¦°øÇßÀ¸¸é ÇÏÁö¸¸ ºÒ°¡´ÉÇÒµí...