|
안녕하세요 만해입니다
김백일님의 예제와 제가 가지고 있던 두권의책 (금년초에 국어판으로 번역된 STL책)을 참고 삼아서
고쳤더니 이제 잘되는데요
사실 TObjectTagList라는 것은
typedef struct _TObjectTagList
{
unsigned int TagType;
unsigned int Size;
bool IsCon;
unsigned int Count;
}TObjectTagList;
보시는것과 같이 그냥 구조체입니다.
제가 클래스로 안만든 이유가
typedef struct _TTag
{
TProperty* Property;
bool Root;
bool IsEnd;
bool IsTerminal;
bool IsTerminator;
char* Contents;
char* TagName;
_TTag* InnerTag;
_TTag* NextTag;
_TTag* ParentNode;
}TTag;
TTag라는 여기 잇는 구조체가 원래는 클래스였는데요
프로그램을 수행하다 보니 메모리를 넘 많이 잡아 먹어서요(200메가 넘게 잡아 먹어요~)
그 이유는 저 TTag라는 클래스가 HTML 문서에서 태그가 하나 나타날때마다 동적으로 생성됩니다.
작업관리자로 이유를 알아본 결과
TTag* Tag = new TTag; <- 이문장 전후로 메모리 사용량이 16Kb 증가
그래서 TObjectTagList라는것도 클래스로 안 만들어 놨는데
원래 TTag 클래스 정의 하는 데서 뭐가 잘못된건지 좀 알려 주실수 없을까요?
밑에 소스 있습니다
천천히 해주셔도 됩고요~ 이런 부탁 해서 미안합니다 ^^a;;
/*-----------------------------------------------------------------------------
Unit Name: HtmlTagInfo
Author: greenuri
Purpose: Html Tag의 정보를 가지는 클래스를 정의.
History: 2002-08-02 기본 구조 설계
2002-08-03 기본 소스 생성 TTagToken,THtmlTag,TPeopertyTag 클래스 생성.
-----------------------------------------------------------------------------*/
#ifndef HtmlTagInfoH
#define HtmlTagInfoH
//---------------------------------------------------------------------------
#include <algorithm>
#include <vector.h>
#include <set.h>
#include <map.h>
#include <deque.h>
#include <bitset.h>
#include <vcl.h>
//---------------------------------------------------------------------------
//2002-08-03
// HTML Parser 구조
// NameSpace를 이용 다른 라이버러리와의 분리
//---------------------------------------------------------------------------
namespace HtmlTagInfo
{
/*-----------------------------------------------------------------------------
Class : TTagToken
Author: greenuri
Date: 2002-08-03
TTagToken 구조.
클래스
ATagName : String ; 태그 명
AIsTerminal : bool ; 터미널 태그 유무
AProperty : 속성들에 대한 값을 가짐.
AIsTerminal : //종료태그인지 판단 , 종료 태그 : true
AIsTerminator: // 단말 태그인지 아닌지 판단, 단말 태그 : true.
-----------------------------------------------------------------------------*/
typedef struct TProperty
{
AnsiString PropertyName;
AnsiString PropertyValue;
}TProperty_u ;
typedef vector<TProperty*> TPropertyList;
//-----------------------------------------------------------------------------
class TTagToken
{
private :
AnsiString ATagName;
bool AIsTerminal;
bool AIsTerminator;
TPropertyList AProperty;
public :
TTagToken ();
TTagToken (AnsiString TagName, bool IsTerminal, bool IsTerminator ,
TPropertyList Property );
~TTagToken(){}
void TagName ( AnsiString Name ){ATagName=Name;};
AnsiString TagName ( void ) { return ATagName; };
void IsTerminal ( bool IsTerminal ) {AIsTerminal = IsTerminal;};
bool IsTerminal ( void ) {return AIsTerminal;};
void IsTerminator ( bool IsTerminator ) {AIsTerminator = IsTerminator;};
bool IsTerminator ( void ) {return AIsTerminator;};
void Property ( TPropertyList Property )
{
AProperty.clear();
AProperty = Property;
};
TPropertyList Property ( void ){return AProperty;};
};
//-----------------------------------------------------------------------------
class TTag : public TTagToken
{
private :
TTag* AInnerTag;
TTag* ANextTag;
TTag* AParentNode;
bool ARoot;
bool AIsEnd;
AnsiString AContents;
public :
TTag():TTagToken()
{
TTagToken();
AInnerTag = NULL;
ANextTag = NULL;
AParentNode = NULL;
ARoot = false;
AIsEnd = false;
AContents="";
};
TTag( TTagToken Token ):TTagToken(Token)
{
AInnerTag = NULL;
ANextTag = NULL;
AParentNode = NULL;
ARoot = false;
AIsEnd = false;
AContents="";
};
TTag( TTag* InnerTag ,TTag* NextTag, bool Root=false):TTagToken()
{
AInnerTag = InnerTag;
ANextTag = NextTag;
AParentNode = NULL;
ARoot = Root;
AIsEnd = false;
AContents="";
};
TTag( TTag* InnerTag ,TTag* NextTag ,TTag* ParentNode, bool Root=false):TTagToken()
{
AInnerTag = InnerTag;
ANextTag = NextTag;
AParentNode = ParentNode;
ARoot = Root;
AIsEnd = false;
AContents="";
};
TTag* InnerTag ( void ){return AInnerTag;};
void InnerTag ( TTag* InnerTag ){AInnerTag = InnerTag;};
TTag* NextTag(void){return ANextTag;};
void NextTag(TTag* NextTag){ANextTag = NextTag;};
TTag* ParentNode(void){return AParentNode;};
void ParentNode(TTag* ParentNode){AParentNode = ParentNode;};
void Root ( bool Root ) {ARoot = Root;};
bool Root ( void ) { return ARoot;};
void End ( bool IsEnd ) { AIsEnd = IsEnd;};
bool End ( void ) { return AIsEnd;};
void Contents ( AnsiString Content )
{
AContents = Content;
}
AnsiString Contents ( void ) { return AContents;};
};
//---------------------------------------------------------------------------
typedef TTag* THTML; // Tags의 집합 -> HTML 문서
//---------------------------------------------------------------------------
};
#endif
|