[완료]클래스의 멤버로서 포인터 멤버를 가질 경우에 질문좀여!

creatorJinsang의 이미지

class Room{
private:
        Place* place;
public:
        Room(const int& size);
};
 
Room::Room(const int& size){
	place = new Place[size];	
}

위와 같이 Room 클래스의 복사 생성자를 형성해서 넘어오는 인자 만큼 배열을 동적할당해주려고 합니다.
Room 클래스의 멤버 포인터 place를 이용하여 place 클래스의 성분에 대해 작업을 하려고 하는데, 초보자인 제 눈에도 여간 꺼림칙하네요;;

1. 저렇게 생성자 내에서 클래스 멤버 포인터를 동적할당할 경우, 일단 예외가 발생하지않는다면 메모리가 떠버리는 일은 없다고 생각하는데, 그렇다고 해도 저렇게 방치해도 될까요??

2. 클래스 내부의 멤버로서 포인터를 가질경우, 캡슐화가 적용되지 않는다고 봐도 무방한가요? 포인터 멤버를 갖는다면 그건 다른 클래스에 대한 핸들을 가진다고 봐도 되나요?

이상 NewB의 질문이었습니다 T_T 답변좀 부탁드릴게요 Please~

aral1의 이미지

1. 저렇게 생성자 내에서 클래스 멤버 포인터를 동적할당할 경우, 일단 예외가 발생하지않는다면 메모리가 떠버리는 일은 없다고 생각하는데, 그렇다고 해도 저렇게 방치해도 될까요??
떠버린다는게 혹시 메모리 누수를 말씀하시는건지요?^^ 멤버포인터에 어떤 메모리를 동적할당 했을 경우 반드시 어디엔가(예를들어 소멸자 같은 곳) delete를 해주셔야 합니다.
그렇지 않으면 알게모르게 메모리 누수가 내부적으로 쌓일 것이며, 오히려 예외가 발생해서 프로그램이 죽을 경우 OS가 이 프로그램이 사용하던 모든 메모리를 회수해가서 정리가 됩니다.
질문자님께서는 배열형태로 할당했으니 배열형태로 반납해야 합니다. -> delete [] place;

2. 클래스 내부의 멤버로서 포인터를 가질경우, 캡슐화가 적용되지 않는다고 봐도 무방한가요? 포인터 멤버를 갖는다면 그건 다른 클래스에 대한 핸들을 가진다고 봐도 되나요?
멤버로서 포인트를 가진다고 캡슐화를 해치는 것은 아닙니다. 서로 다른 객체 간에 서로를 포함하거나 포함되는 관계는 아주 흔한(오히려 정상적인) 모양새입니다.
핸들이라는 단어는 좀 모호한데.. 포인터는 포인터일 뿐 다른 용어로 부르기 시작하면 오히려 혼란스럽습니다. 핸들이란 단어는 시스템 프로그래밍 같은 곳에서 커널오브젝트를 다루는데 더 일반적으로 쓰입니다.

참, 그리고 위는 복사생성자라기 보다는 1개의 인자를 받는 일반 생성자 같네요.
복사 생성자는 보통 Room(const Room& room) 이렇게 생겼습니다.
개인적으론 포인터를 적극 활용하시길 추천드리며, 복사생성자나 연산자 오버라이딩 같은 기법은 별로 추천하고 싶지 않습니다. ㅜㅜ
잘쓰면 강력하지만 경험상 오히려 부작용이 더 많았고 소스도 몇달 지나서 다시보면 이해하기가 힘듭니다.
그래도 꼭 복사생성자 기법을 사용하셔야겠다면 deep copy 방식을 인터넷에서 검색하셔서 참고하시면 도움이 될 것입니다.

creatorJinsang의 이미지

프로그래밍 초보한테 정말 많은 도움이 되었네요 ㅋ
가려운곳을 긁은 느낌이랄까 .. 정말 친절하고 자세한 설명 감사드립니다 ^^

댓글 달기

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