c++ 구조체에 인스턴스를 담아 내보냈을 때 살아있는 문제에 관하여..

hun4000의 이미지

다음과 같은 코드를 짜는데 이해가 가지 않는 부분이 있어서 이렇게 문의드립니다. ㅠ

typedef unsinged char BYTE;
 
struct testt {
	LPBYTE bytes;
};
 
void test(testt& t) {
	BYTE a[10] = { 1 };
 
	t.bytes = a;
}
 
void main() {
	testt ttt;
	test(ttt);
 
	cout << (int)(ttt.bytes[0]) << endl;
	ttt.bytes[0] = 10;
	cout << (int)(ttt.bytes[0]) << endl;
}

test 함수에서 a라는 배열을 생성하고 매개변수로 받은 레퍼런스 변수 t에 그 주소값을 넣어줬는데요
이 부분에서 a변수는 test 함수가 끝나면 사라지게 되는거 아닌가요?
그런데 main 함수에서 해당 주소를 참조하여 값을 출력해봤더니 잘 출력이 되네요..
혹시 메모리만 그렇게 초기화 해놓은 게 아닌가 싶어서 해당 값을 바꿔보기도 했는데
제대로 바뀌네요...

이게 된다고 한다면 이런식으로 코드를 계속 작성하려고 하는데 혹시 나중에 큰 문제가 생기거나 하게 될까요? (해당메모리가 다른값으로 지워진다던가...)

익명 사용자의 이미지

> 혹시 나중에 큰 문제가 생기거나 하게 될까요?

네 문제가 됩니다. 절대로 하면 안되는 행동입니다.

mirheekl의 이미지

이러면 최소한 액세스 자체는 안전해지지만 다른놈이 값을 덮어씌웠을 경우 무방비가 되겠죠.

그런 상황에서 쓸 수 있는 게 몇가지 있는데..

얼른 생각나는건 test함수에서 a에 해당하는 메모리를 스택 변수로 잡는게 아니고 malloc등으로 동적 할당 하는것입니다. 그리고 메모리를 다 쓰고 나면 free로 지워주는 방법.

예 그렇죠. free로 지워주는게 귀찮습니다. 그래서 C/C++에도 메모리 관리를 도와주는 여러 가지 기법들이 발달한 것입니다.

또는, 현재 C++을 사용하고 계시니 구조체를 만들고 굳이 거기에 종속된 전역함수를 따로 만드실 필요는 없습니다. 두가지를 합쳐서 다시 클래스로 선언해버리셔도 됩니다. a는 클래스 멤버 변수로 선언하고요. (지역변수면 어차피 마찬가지임.)

이경우 클래스 인스턴트가 사라지기 전까진 a의 주소를 맘껏 쓰실 수 있습니다. 언급된 소스만으론 이게 제일 자연스러워 보이네요.

아니면 뭐.. 그냥 구조체 안에 a를 선언해도 되지만 이건 넘어가겠습니다. 그렇게 하지 않으신 이유가 있을테니 말이죠

--

댓글 달기

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