free시에 메모리의 데이터는??

mg2000의 이미지

malloc으로 할당을 하고 free로 해제를 하는데요.

Windows나 Linux에서는 free를 해주면 사용했던 메모리 공간은 ee나 NULL로 채워버리게 되는데요.

HP-UX에서는 메모리 공간의 데이터가 그대로 남아있네요.

원래 free 해줄때, free함수로 메모리 공간을 초기화해줄 의무는 없는 것인지,

그렇다면, 메모리 공간에 데이터를 남기고 싶지 않다면 수작업으로 초기화를 해 주어야 하는 것인지 궁금하네요.

nineye의 이미지

windows나 linux에서도 debug 빌드에서만 그렇지 않나요?
그렇지 않다면 쓸데없는 overhead가 있을 것 같은데...
성능을 중요시 하는 프로젝트에서는 memcpy나 memset의 부하도 정말 만만치 않더라구요...
어쩔 때는 new의 부하도 감당하기 힘들어서 malloc으로 할당하고,
필요한 부분만 replacement new를 이용한다는...
debugging 용도가 아니라면 차라리 해제한 메모리를 특정 값으로 채우는 건
없는 것이 더 좋을 것 같네요...

_________________________________________________________

nineye's blog

cinsk의 이미지

보안? 문제 때문에 그러시는 것 같은데, malloc()/free()는 메모리를 초기화하거나 지울 의무가 없습니다. 제 기억이 맞다면 Windows Visual C 계열에서는 debug build시 초기값을 지정하지 않은 경우, 0xCC인가... 의 값으로 초기값을 강제로 준 것 같았는데, Linux의 glibc는 그런 기능을 제공하지 않습니다. 궂이 꼭 필요하다면 malloc()/free() wrapper를 만드는 것도 한 방법입니다.

Wikipedia에 있는 ASLR도 참고하기 바랍니다.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

mg2000의 이미지

Visual C++에서는 free를 해주면 Release에서도 이전 데이터는 깨져버리는 것 같은데...

Fedora8에서도 실행해보면, NULL로 채워버리는 것 같고요.

그냥 아래와 같은 단순한 코드로 테스트 해본것이지만요.

#include stdio.h  // 꺽쇠 생략
#include stdlib.h
#include string.h
 
int main()
{
    char *m = (char *)malloc(10);
    if (m == NULL)
        return 1;
 
    strcpy(m, "12345678");
    printf("before: %s\n", m);
 
    free(m);
    printf("after: %s\n", m);
 
    return 0;
 
}

결국 Wrapper Class를 만들어주는게 가장 속편한 것일런지...

JuEUS-U의 이미지

보안 측면에서 지워주는게 확실히 안심이 될겁니다만,
어차피 왠만해선 어디서부터 어디까지가 데이터인지 구분하기 힘듭니다. (string이 아닌 이상...)
침입자 입장에선 그걸 찾아내느니 그냥 역어셈을 하는게 *확실히* 나을겁니다.

댓글 달기

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