new ¿¬»êÀÚÀÇ Áø½Ç
C++¿¡¼´Â ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ ¶§ new ¿¬»êÀÚ¸¦ »ç¿ëÇÕ´Ï´Ù.
±×¸®°í ÀÌ new ¶ó´Â ¿¬»êÀÚ´Â ¿À¹ö·ÎµùÀÌ °¡´ÉÇÕ´Ï´Ù. ±×·³ °ú¿¬ ÀÌ new ÀÇ Á¤Ã¼´Â ¹»±î¿ä?
new ¸¦ È£ÃâÇÏ¸é ½ÇÁ¦·Î´Â malloc ÀÌ ³»ºÎ¿¡¼ ´Ù½Ã È£Ãâ µÈ ´Ù´Â °ÍÀº ÀÏ´Ü ´Ù ¾È´Ù°í °¡Á¤ÇÏ°í ³Ñ¾î°¡°Ú½À´Ï´Ù.
ù ÄÚµå ³ª°©´Ï´Ù. ¿¬»êÀÚ new ¸¦ ¿À¹ö·Îµù ÇÑ °æ¿ìÀÔ´Ï´Ù.
#include
#include
class Test
{
public:
int a;
void* operator new(size_t size)
{
printf("ÇÑ °³ ÇÒ´çÁß\n");
Test* temp = (Test*)malloc(size);
return temp;
}
Test()
{
printf("Test Constructor\n");
}
};
int main()
{
Test* t1;
t1 = new Test;
system("pause");
return 0;
}
new ¿¡´Â size_t ÇüÅÂÀÇ ÆÄ¶ó¸ÞÅͰ¡ Çϳª Á¸ÀçÇÕ´Ï´Ù. ÀÌ ÆÄ¶ó¸ÞÅÍ·Î ÇÒ´ç ÇØ¾ß ÇÒ Å©±â¸¦ ¾Ë·ÁÁÝ´Ï´Ù. ´Ü¼øÈ÷ ±× Å©±â·Î ¸Þ¸ð¸®¸¦ ÇÒ´ç ÇÏ°í ¸®ÅÏ ¸¸ ÇÏ¿³½À´Ï´Ù.
½ÇÇà°á°ú´Â ¾Æ·¡¿Í °°½À´Ï´Ù.
¿ì¸®´Â ºÎ¸¥Àûµµ ¾ø´Â »ý¼ºÀÚ°¡ È£ÃâµÇ¾ú½À´Ï´Ù. new °¡ ´Ü¼øÈ÷ ¸Þ¸ð¸® ÇҴ縸 Çϵµ·Ï ¿À¹ö·Îµù ÇÏ¿³´Âµ¥¿ä. ¿©±â¼ new ´Â ½ÇÁ¦·Î´Â ¿À¹ö·ÎµùÀÌ µÇÁö ¾Ê¾Ò´Ù°í ÇÒ ¼ö ÀÖ°Ú½À´Ï´Ù. ¹º°¡ ¼ö»óÇϱº¿ä. µð½º¾î¼Àºí ÇØ º¸¾Ò½À´Ï´Ù.
ÀÌ·± ¿ì¸®´Â new ¸¦ È£ÃâÇßÀ» »ÓÀε¥ ½ÇÁ¦·Î´Â operator new ¶ó´Â ÇÔ¼ö¿Í »ý¼ºÀÚ¸¦ µû·Îµû·Î È£Ãâ Çϰí ÀÖ¾ú³×¿ä. ±×·³ ¿ì¸®°¡ ¼öÁ¤ÇÑ °ÍÀº operator new ¶ó´Â ÇÔ¼ö ÀÏ »Ó new ¿¬»êÀÚ ÀÚü°¡ ¾Æ´Ï¶ó´Â°ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.
½ÉÁö¾î ÀÁÙ¿¡¼´Â ÇÒ´ç ÇÒ ¸Þ¸ð¸® Å©±â¸¦ ½ºÅÿ¡ Áý¾î³Ö¾îÁִ ģÀýÇÔ(?) ±îÁö ¿³º¼ ¼ö ÀÖ±º¿ä. Pop ÀÌ È£ÃâºÎÀ§ ¾Æ·¡¿¡ Á¸ÀçÇÑ´Ù´Â °ÍÀº operator new ´Â cdecl ¹æ½ÄÀ¸·Î call µÇ°í ÀÖ´Ù°í ÁüÀÛ ÇÒ ¼ö ÀÖ°Ú½À´Ï´Ù.
±×·³ new ´Â ´ÜÁö operator new ¿Í »ý¼ºÀÚ¸¦ È£Ãâ Çϰí ÀÖÀ» »ÓÀ̶ó¸é ÀÌ µÎ ÇÔ¼ö¸¦ µû·Î µû·Î È£ÃâÇϴ°͵µ °¡´ÉÇÏÁö ¾ÊÀ»±î¿ä? ´ÙÀ½°ú °°Àº Äڵ带 Â¥ º¸¾Ò½À´Ï´Ù.
#include
#include
class Test
{
public:
int a;
void* operator new(size_t size)
{
printf("ÇÑ °³ ÇÒ´çÁß\n");
Test* temp = (Test*)malloc(size);
return temp;
}
Test()
{
printf("Test Constructor\n");
}
};
int main()
{
Test* t1;
t1 = (Test*)Test::operator new(sizeof(Test));
t1:Test();
system("pause");
return 0;
}
±×¸®°í ½ÇÇà ÇØ º¸¾Ò½À´Ï´Ù.
ÀÌ·± ¿ÏÀüÈ÷ ¶È°°±º¿ä.
±×·³ ÀÌ·¸°Ô °á·Ð ³»¸± ¼ö ÀÖÀ»±î¿ä? new ¿¬»êÀÚ´Â operator new ÇÔ¼ö¸¦ È£Ãâ ÇÑ ÈÄ, »ý¼ºÀÚ¸¦ È£Ãâ ÇØ ÁÖ´Â ¿¬»êÀÚÀÌ´Ù.
±×·±µ¥ ÀÌ°Ô ¶Ç ¾Æ´Ñ°Å °°½À´Ï´Ù. ¿Ö³Ä¸é ÀÌ µÎ ÇÔ¼ö¿¡´Â VMT(Virtual Methor Table) À» »ý¼º ÇØ ÁÖ´Â ºÎºÐÀÌ ¾ø°Åµç¿ä. °¡»óÇÔ¼ö°¡ ÇÑ °³ ÀÌ»ó Á¸ÀçÇÏ°í »ó¼Ó°ü°è°¡ Àִ Ŭ·¡½º(»ó¼Ó ¹Þ¾Ò´ø »ó¼Ó Çß´ø) ¿¡´Â ¹Ýµå½Ã VMTÀÇ Æ÷ÀÎÅͰ¡ Á¸ÀçÇÕ´Ï´Ù. ±×·³ ÀÌ VMT´Â ¾ðÁ¦ µî·ÏµÇ¾úÀ»±î¿ä? »ì¦ Äڵ带 °íÃĺ¸¾Ò½À´Ï´Ù.
#include
#include
class Test
{
public:
int a;
void* operator new(size_t size)
{
printf("ÇÑ °³ ÇÒ´çÁß\n");
Test* temp = (Test*)malloc(size);
return temp;
}
Test()
{
printf("Test Constructor\n");
func();
}
virtual void func()
{
printf("Test::func()\n");
}
};
class Test2 : public Test
{
virtual void func()
{
printf("Test2::func()\n");
}
};
int main()
{
Test* t1;
t1 = new Test2;
system("pause");
return 0;
}
»ý¼ºÀÚ¿¡¼ func¶ó´Â °¡»óÇÔ¼ö¸¦ È£Ãâ Çϰí ÀÖ½À´Ï´Ù.
¿ì¸®´Â Test2¸¦ »ý¼ºÇÏ¿´À¸¹Ç·Î Test2::func() °¡ Ãâ·Â µÉ °Å¶ó°í ±â´ë ÇÒ ¼ö ÀÖ°Ú½À´Ï´Ù. °á°ú¸¦º¼±î¿ä?
¾î¶ó ¹º°¡ ÀÌ»óÇÕ´Ï´Ù. Test::func() °¡ Ãâ·ÂµÇ¾ú³×¿ä. ÀÌ°Ô ¾îÂî µÈ ÀÏÀϱî¿ä?
±× ÀÌÀ¯´Â »ý¼ºÀÚ¸¦ È£Ãâ ÇÏ´Â ½ÃÁ¡¿¡¼´Â VMTÀÇ Æ÷ÀÎÅͰ¡ Á¦´ë·Î µî·Ï µÇÁö ¾Ê±â ¶§¹®¿¡, °¡»óÇÔ¼ö º»·¡ÀÇ ¿ªÇÒÀ» Á¦´ë·Î ÇÏÁö ¸øÇÏ´Â °Ì´Ï´Ù. µð½º¾î¼Àºí ÇÑ Äڵ带 º¸°Ú½À´Ï´Ù.
»ý¼ºÀÚ¸¦ È£Ãâ ÇÑ ´ÙÀ½¿¡µµ Ãß°¡ÀûÀÎ ÀÛ¾÷À» Çϰí ÀÖ½À´Ï´Ù.
±× Áß »¡°£ ³×¸ð·Î Ç¥½Ã µÈ ºÎºÐÀÌ °¡»óÇÔ¼ö°¡ ¾øÀ»¶§´Â Á¸ÀçÇÏÁö ¾Ê´ø ºÎºÐÀÔ´Ï´Ù.
Áï Àú ºÎºÐ¿¡¼ VMTÆ÷ÀÎÅ͸¦ Ãß°¡ÇÏ´Â ÀÛ¾÷À» Çϰí ÀÖ´Ù°í »ý°¢ ÇÒ ¼ö ÀÖ°Ú½À´Ï´Ù.
ÀÌÁ¦ new ÀÇ Áø½ÇÀÌ ¹àÇô º±º¿ä.
new ¿¬»êÀÚ¸¦ È£ÃâÇϸé
1. ¸Þ¸ð¸® ÇÒ´çÀ» À§ÇØ operator new ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù
2. »ý¼ºÀÚ¸¦ È£ÃâÇÑ´Ù
3. VMT¸¦ µî·ÏÇØ ÁØ´Ù
ÀÌ 3°¡Áö °úÁ¤À¸·Î new ÀÇ ¿ªÇÒÀº ¸ðµÎ Á¾·áµË´Ï´Ù.
½±°í ÆíÇÏ°Ô ¾²´ø ¿¬»êÀÚ°¡ Âü ÇÏ´Â Àϵµ ¸¹³×¿ä : )
±×·³ ¶Ç ´Ù¸¥ ¾ð¾îÀÎ Delphi ÀÇ °æ¿ì´Â ¾î¶³±î¿ä?
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
Test = class
public
a : Integer;
procedure func;virtual;
constructor Create;
end;
Test2 = class(Test)
public
procedure func;override;
end;
constructor Test.Create;
begin
func;
end;
procedure Test.func;
begin
WriteLn('Test.Func');
end;
procedure Test2.func;
begin
WriteLn('Test2.Func');
end;
var
T : Test;
begin
T := Test2.Create;
ReadLn;
end.
Ãâ·Â °á°ú´Â ¾Æ·¡¿Í °°½À´Ï´Ù.
Delphi´Â »ý¼ºÀÚ È£Ãâ ½ÃÁ¡ÀÌ VMT »ý¼º ½ÃÁ¡º¸´Ù µÚÀÔ´Ï´Ù.
Áï Delphi ¿¡¼´Â »ý¼ºÀÚ ³»¿¡¼ °¡»óÇÔ¼ö¸¦ È£ÃâÇÏ´õ¶óµµ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÕ´Ï´Ù.
|