포인터 질문입니다

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

포인터 질문입니다

Post by 비회원 »

Code: Select all

template <class>
class lala
{
     lala()
     {
          for (int i=0; i<2; i++)
          {
                   for (int k=0; k<200;k++)
                         m_Type[i+k] = new Type;
           }

           /*
               for (int i=0; i<2; i++)
              {
                         m_Type[i] = new Type[200];
               }
           */
      }

    Type* m_Type[2];
};
위 코드 실행 시키면 런타임 에러나 납니다
아래 코드는 괜찮습니다. 얼핏 보기엔 똑같아 보이는데
차이점이 무얼까요?
비회원

;;

Post by 비회원 »

위에껀 m_Type[1],m_Type[2],m_Type[3] 가 중복할당 될 뿐더러
m_Type[201]까지 접근하고자 하려는 코드이고,

아래껀 m_Type[0][199], m_Type[1][199]까지 접근 가능한 코드입니다.

후자가 의도하시는 코드인것같네요.

열의는 좋으신데, 문법책을 좀 더 보셔야 할 듯합니다 ^-^;
비회원

Re: 포인터 질문입니다

Post by 비회원 »

문제가 어려울 수록 단순화하는게 중요합니다.

Code: Select all


class lala
{
     int* m_Type;

public:
     init()
     {
          for (int i=0; i<2; i++)
          {
                   for (int k=0; k<200;k++)
                         m_Type[i+k] = new int;
           }
     }

     init2()
     {
               for (int i=0; i<2; i++)
              {
                         m_Type = new int[200];
               }
     }
};

init()은 딱보면 알 수 있듯이 할당 되지도 않은 영역에 int를 할당하려고 하고 있습니다. 말이 안되는 거죠.
init2()는 포인터 변수에 200개의 인트형 메모리를 잡는 것입니다. 아무런 문제가 없죠.

만약 init()이 정상적으로 작동을 하게 하려면,

Code: Select all


template<typename>
class lala
{
     typename typedef Ty Type;
     typedef std::vector<Type> lalaContType;
     lalaContType vecData;

public:
     lala( void )
     {
          vecData.clear();
     }

     lala( size_t Col, size_t Row )
     {
          vecData.reserve( Col*Row );
          for (int i=0; i<Col; ++i )
          {
                   for (int k=0; k<Row;k++)
                         vecData.insert( i*k, new Type );
           }
     }

     lala( size_t Cnt, size_t Size )
     {
           vecData.reserve( Cnt*Size );
           for (int i=0; i<Cnt; ++i )
           {
                 vecData.insert( i, new int );
           }
     }
};


가 되어야 합니다. 위의 코드는 걍 생각나는대로 막 적은 거라서 안돌아가는게 정상이구요. 이해만 하시길 바래요.

그리고 여담입니다만, 위의 코드는 쓰레기입니다. 말도 안되는 코드죠. 하지 말아야 할 짓을 많이 하고 있습니다. 리절브를 안하고 리사이즈하면 될 것을 보여주기(?) 위해서 하고 있고요. 문제는 생성자에서 메모리 할당을 하기 때문에 위험부담도 큽니다. 이런 코드는 되도록이면 쓰시지 말기를 바래요.

그리고 한가지 충고드리고 싶은 것은 너무 한 곳에 집중해서 파고들지 마세요. 너무 깊이 있는 학습보다는 우선은 넘기고 이해를 하고 다음으로 넘어간 뒤, 점차적으로 파고드는 것이 더 좋을 듯 합니다. 그럼..^^
Locked