'stl'에 해당되는 글 4건
- 2008/01/14 stl 을 사용한 파서 구축하기 (펌)
- 2007/11/14 Vector를 사용할때 매번 하는 부분을 template로 대체해서 사용하장..!!
- 2007/09/18 STL 샘플 코드...강추!!!
- 2007/09/17 소멸자를 virtual로 ... (string 가 메모리 릭이 발생할때..) (2)
물론 펌 입니다.
출처 : http://blog.naver.com/inobae?Redirect=Log&logNo=90025826561
사용법은 아래와 같아요.
1. 파싱할 sample.txt 파일
홍길동, 3000, 45,6
2. 같은 형태의 포멧을 가진 txt 파일이 있을때
아래와 같이 우선 파일을 로드 합니다.
file.open("sample.txt");
3. 해당 파일을 한줄 단위로 읽습니다.
그리고 나서 StringToKenizer 클래스를 사용해서 파싱합니다.
while(!file.eof()) // 다 읽었다면 빠져 나간다.
{
// 한줄당 읽어 들입니다.
file.getline(buf, 1024);
// 토큰 분리
StringTokenizer st = StringTokenizer(buf, ",");
// 파싱된 문자열을 해당 값에 따라서 저장하면 됩니다.
string name = st.NextToken();
double value0 = atof(st.NextToken().c_str());
double value1 = atof(st.nextToken().c_str());
}
vector를 사용해서 객체를 저장할때 포인터 형으로 하게 되면
메모리 누수를 막기 위해서 객체를 항상 Delete 해줘야 한다.
솔직히 매번 Add, Delete, DeleteAll 등을 해줘야 하는 불편함이 전(??) 있었다. ^^
그래서 템플릿으로 하나 만들었다.
for-each 이건.. 왜 안되는지 ^^.. 암튼.. 현재걸로 조금 우선 사용해보자.
// 사용법 //
CGsiV<CTest> VectorArray;
VectorArray.Add(new CTest());
int size = VectorArray.GetVector()->size();
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// CGsiV
template <class T>
class CGsiV
{
public:
CGsiV() {
m_v.clear();
}
virtual ~CGsiV() {
DeleteAll();
}
// Add
void Add(T* t) {
m_v.push_back(t);
}
// Delete
bool Delete(T* t) {
T* p;
vector<T*>::iterator iter;
for(iter = m_v.begin(); iter != m_v.end(); ++iter) {
p = (*iter);
if(p != NULL && p == t) {
delete p;
p = NULL;
m_v.erase(iter);
return true;
}
}
return false;
}
// DeleteAll
void DeleteAll() {
T* p;
vector<T*>::iterator iter;
for(iter = m_v.begin(); iter != m_v.end(); iter++) {
p = (*iter);
if(p != NULL) {
delete p;
p = NULL;
}
}
m_v.clear();
}
//GetVector
vector<T*>* GetVector() { return &m_v; }
protected:
vector<T*> m_v;
};
stl::string 를 사용해서 문자열을 받는 곳에서 메모리 릭이 발생!!
아.. 어디지?.. 이게 왜 릭이 생기지?..
상속 구조를 취하게 되었을때 소멸자를 virtual로 해주어야 하는 것을 깜박 했다.
앞으로는 조심조심. ^^..







Prev
Rss Feed