[긴급]전역으로 선언한 메모리의 해제..

leolo의 이미지

아래와 같이 전역으로 선언한 메모리 구조에서도
메모리 누수가 발생하는지요..
메모리 동적 할당이 아닌 이상, 다음과 같이 잡고
프로그램이 정상적으로 종료 되면.. 메모리는 해제 되는지 알고 싶습니다.
만약, 이 프로세스가 좀비가 된다면,
또 한 어떠한 상황이 발생하는지요. 좀비가 된 후에
죽어 없어진다면요..

끝으로 메모리 누스를 체크하는 방법을 알려주세요..
툴 말고요.. 임베디드보드에서 사용하는지라.. 툴로는 힘듭니다.
/proc/meminfo로 확인하는 방법 좀 알려주세요..
어떤 부분을 보면 되는지요..

제 짧은 생각이라.. 문의 내용이 맡는지 잘 모르겠습니다.
부탁드립니다..

XXXX.h 
struct bec_conn_info { 
         uint8_t   line; 
         uint8_t   dev_id; 
         uint8_t   ba[6]; 
         uint16_t  port; 
         uint32_t  tx; 
         uint32_t  rx; 
         uint8_t   name[248]; 
} __attribute__ ((packed)); 
#define BEC_CONN_INFO_SIZE 266 
extern bec_conn_info peerlist[]; 

XXXX.c 
struct bec_conn_info peerlist[BT_NBT_DATAPORTS]; 
Necromancer의 이미지

전역변수는 메모리 누수가 절대 일어나지 않습니다.
전역변수는 프로그램 로드시에 지정된 양만큼만 미리 공간이 확보되며, 이 공간은
크기도 변하지 않고, 프로그램이 종료될 때까지 같이 따라갑니다.
또한 전역변수 중에 static으로 된 것들은 그 내용이 프로그램 속에 아예 하드코딩됩니다.
(1M 정도의 char 전역변수 배열 하나를 한쪽은 그냥 auto로 놓고 한쪽은 static으로
해서 한번 컴파일해보세요. static으로 한쪽은 실행파일 크기가 진짜 1M 넘게 나옵니다.)

메모리 누수는 주로 malloc()으로 할당한 메모리를 제때 해제하지 않을 때에만,
생깁니다. 또한 무한 재귀호출을 할경우에도 메모리누수와 비슷한 현상이
벌어질 수 있는데 이땐 재귀호출을 어떻게 해서 풀어버리면 사라지죠.
(함수 호출할때마다 매번 스택이 까먹히니까요)

그리고 제발 좀 [긴급] 붙여주지 않았으면,
붙여봤자 아무 소용 없습니다

Written By the Black Knight of Destruction

최종호의 이미지

흑기사 wrote:

(1M 정도의 char 전역변수 배열 하나를 한쪽은 그냥 auto로 놓고 한쪽은 static으로
해서 한번 컴파일해보세요. static으로 한쪽은 실행파일 크기가 진짜 1M 넘게 나옵니다.)

수행시의 크기는 1M가 넘지만 실행파일은 안 그럴 수도 있습니다.
초기화되지 않은 전역변수는 BSS 영역에 생기는 것이 그 이유입니다.

static int a[1000000];
main()
{
}

int a[1000000] = {1};
main()
{
}

의 컴파일한 실행파일의 크기를 비교해 보시면 차이를 아실 수 있습니다.

비슷한 논의가 전에 한번 됐었던 것 같은데...

http//bbs.kldp.org/viewtopic.php?t=3643&highlight=BSS

여기에 있네요.

알고 쓰신 것이겠지만 전역변수는 auto로 정의가 되지 않습니다. ^^
전역변수에 static 이라고 쓰면 해당 파일 밖에서는 정의한 변수가 안보이도록 하는 역할을 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.