C++ 클래스 new delete 가 이해가 ^^;;

la9527의 이미지

예를 들어..

class A 
{
    public:
         void A(void);
}

void A::A(void)
{
      char* A[] = new char [100];
}


main()
{
    A*  a  = new A;
    delete a;   
}

이렇게 되었을때 A 클래스 안의 new 데이터는 delete 시켜주지 않아도 되는지 궁금합니다. 과연 메모리가 새는지.. ^^;

이렇게 하면 않된다는걸 아는데.. 과연 괜찮은지 설명 좀 부탁 드립니다. ^^;;

spinel1의 이미지

이 코드는 아예 잘못된 코드인것 같은데요. 일단 클래스 내에 'void A(void); ' 이렇게 주신건 생성자를 의도하신건지 아닌지 모르겠네요. 생성자는 리턴 타입이 존재하지 않아 ' A(void) ' 이렇게 주셔야 되거든요. 그리고 A() 함수 내에 " char* A[] = new char [100]; " 이 부분도 틀린 문법이네요. []<- 이놈을 제거해 주셔야죠. 즉... char* A = new char [100]; 이렇게 해 주시구요.

아울러 님께서 궁금해 하시는 메모리 누수는 존재합니다. 님의 코드는 만약 문법적으로 하자가 없다 해도 void A() 라는 함수 안에서 new를 해 주셨기 때문에.. void A()함수 끝에 delete를 해 주셔야 합니다. 아래와 같은 식으로요.

void A::A(void)
{
char* A = new char [100];
/*
여기서 어떤 일들을 하겠죠??
*/
delete A; // 반드시 넣어 줘야죠.
}

winner의 이미지

member 가 동적할당하면 보통 소멸자에서 delete 하죠.

어느정도 공부가 진행되었는지 모르겠습니다만 이런 것은 대입연산자와 복사생성자에도 신경을 써서 만들어야 합니다.

byung82의 이미지

A::A{}

속에 있는 char *A = new char[100];

이놈은 삭제되지 않습니다.

동적할당된 메모리는 삭제시만 삭제가 가능합니다.

만약 클래스만 삭제 했을때 그 안에 사용된 모든 메모리 객체를 해제 하고 싶으시면 동적객체 할당을 멤버 변수로 잡아 주시고 소멸자에 delete를 넣어주시면 됩니다.

이렇게

class A
{
private:
    char m_A;
public:
    A();
    ~A();
}

A::A()
{
    m_A = new char[100];
}
A::~A()
{
    if( m_A != NULL )
        delete[] m_A;
    m_A = NULL;
}

int main( void )
{
    A *a = new A;

    delete a;
}

참조가 되셨는지요

그럼

sangjune.ahn의 이미지

좋은 참고 자료가 되었습니다.

la9527의 이미지

제가 코드를 정확하게 않써서 ^^;; 잘못된 경우가 많이 눈에 보이네여..

제가 생각하고자 한것은 꼭 new를 해주면 delete는 따라가야 되는것 이게 맞는 말인지요?

제 생각은 클래스를 new 생성하고 나서 delete 시켜주면 클래스 내용안의 함수에 new되어 있는 것도 같이 delete 되어주지 않을까 하는 생각에 의해서 입니다.

다시한번 답변 감사드립니다. ^^

winner의 이미지

전체와 내부는 독립적으로 동적할당되고 해제됩니다.

이것은 class 가 아닌 struct 도 마찬가지입니다.

동적할당한 member 를 해제하기 전에 전체 객체를 해제하면 member 를 다시 접근할 수 없기 때문에 전체객체를 해제하기 전에 member 부터 해제해야 하며, 따라서 소멸자가 존재하는 것입니다.

댓글 달기

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