C++ 레퍼런스 타입 변수를 이용하여 힙 영역 메모리 해제 가능 합니까?

ntctomy의 이미지

예를 든다면,

class A{};

A *p1 = new A();
A *p2 = new A();
A &r = *p1;
p1 = p2;

이렇게 되면 레퍼런스 타입 r 변수는 heap 영역의 공간을 참조 하고 있습니다.
이럴 경우 어떻게 해제 해야 되는지요?

delete &r 이게 맞는지요?

답변 좀 부탁 드리겠습니다^^

drinkme의 이미지

맞을겁니다. 한번 해보는게 어떨까요?

chadr의 이미지

그렇게 하셔도 되고 delete p1; 을 하시길 권장해 드립니다.
가능한 delete는 포인터에 쓰도록 하세요. 그래야지 나중에 안헷갈립니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

buelgsk8er의 이미지

레퍼런스 변수나 포인터 변수나 객체를 참조하는데 사용된다는 건 마찬가지라고 할 때,

어떤 경우에 레퍼런스를 쓰고 어떤 경우에 포인터를 쓸 지 사실 모호하게 느껴질 수도 있을 것 같아요

저 같은 경우엔 레퍼런스 변수는 포인터 변수와는 달리 다른 객체를 참조하거나 NULL로 변경하는 것이 불가능한 만큼,

해제가 일어나지 않을 것, 참조를 변경하지 않을 것이 확실한 경우에 레퍼런스를 씁니다. 또 이런 구분을 이용해서 참조 객체에 대한 소유 관계를 나타내는데 쓰기도 합니다.

가령 어떤 객체 A가 멤버 변수로 어떤 객체 B를 참조할 경우, 레퍼런스를 사용한다면 A는 B를 참조만 할 뿐 B의 할당/해제에는 관여치 않는다는 것을, 포인터를 사용한다면 B의 할당/해제할 책임을 진다는 것을 나타내는 것이죠.

또 어떤 함수가 어떤 객체 B를 참조로 받아야 한다면, 그 함수가 반환될 때까지 객체 B를 해제하지 않는다는 것이 확실할 때는 레퍼런스를 쓰는 것이죠. 만약 그 함수 내에서 객체 B에 대한 해제가 일어날 수 있다면 포인터를 쓰고요.

이렇게 구별해서 쓰는 게 보편적으로 얼마나 유용성이 있을진 모르겠지만, 적어도 제겐 도움이 되더라구요. ㅎㅎ

댓글 달기

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