이진트리 동적메모리 해제

dudtkd4567의 이미지

안녕하세요, 직장 2개월차 초보 개발자입니다.

폴더구조를 구현하기 위해 이진트리를 사용하는 중에 궁금한 점이 있어 질문드립니다.

언어 : C

tyypedef struct tagNode {
	int value;
 
	struct tagNode* Left;
	struct tagNode* Right;
}Node;
typedef Node* NodePtr;
 
NodePtr Create_Node(int val)
{
	NodePtr NewNode = (NodePtr)malloc(sizeof(Node));
 
	NewNode->value		= val;
 
	NewNode->Left		= NULL;
	NewNode->Right		= NULL;
 
	return NewNode;
}

위와 같이 이진트리 구조체와 이진트리 생성 함수를 만들었습니다.

근데 노드를 생성할 때 마다 malloc으로 동적메모리를 할당하게 되는데 이 동적메모리는 어떻게 해재해 줘야 되나요? 함수 내에서 만들자 마자 해제할 수도 없고, 전역이 아닌 지역변수 메모리라 찾아가기도 어렵네요. 프로그램 마지막에 트리 전체를 운행해서 하나하나 해제해 줘야 될까요?

단, 폴더구조를 구현하는 거라 프로그램 끝날 때 까지 살아있어야 하긴하는데, 그렇다면 해제 안해줘도 별 문제 없는건가요?

그것때문에 이진트리 구현은 저렇게 재귀식 알고리즘에서 동적메모리를 남발하는 건가요?

선배님들의 의견을 듣고싶습니다.

익명 사용자의 이미지

1. 해당 자료구조를 다 쓰고 나서, 더 이상 메모리에 남아 있을 필요가 없게 되었을 때 해제해 주어야지요.
그 시점이 언제인지는 상황에 따라 다르며 개발자만 정확히 알 수 있습니다.

그러나 사실 프로그램이 살아 있는 한 메모리에 남아 있을 자료구조라면 해제에 대해서 꼭 신경을 써 줄 필요는 없기는 합니다. 어차피 프로그램이 종료되면 메모리 위의 자료구조도 같이 폭파되니까요.

그래도 프로그램이라는 게 늘 나중에 어떻게 변화할지 모르는 것이기 때문에 저는 늘 객체의 소멸 및 메모리 해제를 신경씁니다. 가능한 한 적은 (프로그래머) 비용으로 처리가 되면 좋지요. 소멸자 안에 짜 넣으면 가산점, 스마트 포인터를 써 주면 추가 가산점. 다 귀찮으면 GC가 있는 언어를 쓰세요.

2. 네. 트리를 수동으로 삭제할 때는 트리를 이루는 노드를 하나도 빠짐없이, 그러나 중복되지는 않게 방문하여 삭제해 주어야 합니다. 이것도 일종의 tree traversal입니다.

3. 조금 off-topic입니다만 본문에 제시된 것과 같이 동적 할당된 메모리들이 불규칙하게 포인터로 연결되어 있는 자료구조는 은근히 성능 패널티가 있습니다. 물론 그런 걸 신경써야만 하는 상황일 때에 한합니다만, 그래서 늘 이런 자료구조를 멀리하고 가급적 vector 등 연속적인 메모리를 다루는 자료구조를 사용하자는 주장이 나오곤 하죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.