|
short * 는 당연히 4Byte가 되죠. 것도 포인터이니까
제말은 다음구문에 nSize갯수만큼 new 하는데
pHori = new short[nSize];
이때 할당되는 size는 nSize * sizeof(short ) = nSize * 2 Byte 가 된다는 얘기입니다.
이경우 nSize 갯수만큼 객체를 기억하려면 문제가 되지않겠어요?
그리고 객체에 접근할때도
pHori[ num] ;
뭐 이런식으로 접근하면 short 크기(2Byte) 씩 계산해서
num * 2 위치에 값을 읽어오거나 하겠죠..
아닌가요?
이용태 님이 쓰신 글 :
: 객체 안에 있는 short형 포인터는 동적으로 할당된 메모리를 가리킬 포인터 입니다.
:
: short* 변수의 sizeof()를 하면 포인터 변수의 크기이므로 4byte = 32bit가 나오네요..
:
: 장성호 님께서 먼가 착각하셨던거 같습니다..
:
:
: 다시 원래 문제로 돌와오면 TDataHanding_ECT 객체를 벡터에 넣어서 할 경우엔 위와 같은 문제가 생기는 반면에... 벡터를 사용하지 않고, TDataHandling_ECT 객체 배열을 사용하면 이상없이 잘 됩니다.
:
: 머가 문제인지 모르겠습니다...ㅠㅠ
:
:
: 장성호 님이 쓰신 글 :
: : 다른것은 잘 모르겠구요
: :
: : 객체를 저장할 Pointer가 왜 short형이죠?
: :
: : short형이면 2Byte 인데
: :
: : win32에서 모든 포인터는 32bit인데 16bit로 access하려면 이상하게 동작할수 밖에 없을듯...
: :
: : 먼저 short형을 int형(32bit 형) 으로 바꾸고.. 테스트 해보세요
: :
: : 그럼..
: :
: : 이용태 님이 쓰신 글 :
: : : 클래스 객체를 vector에 넣어서 데이터를 관리할려고 합니다.
: : :
: : : 밑에 소스에서 보는것과 같이..
: : :
: : : 지역 클래스 객체 2개를 만든다음에 벡터에 넣고... 메모리를 할당하고 데이터 값을 초기화 합니다.
: : :
: : : 그런데 이상한게.. 각 객체에 대해서 따로따로 동적으로 메모리를 할당했는데..
: : :
: : : 동적으로 생성된 메모리 주소를 비교해보면 두개의 객체가 한개의 동일한 메모리를 가리킵니다.
: : :
: : : 벡터에 어떤 값을 집어 넣을경우에 값에 의한 복사가 이루어지는것으로 알고 있는데요... 서로 다른 객체 2개를 넣으면 서로 다른 복사본 객체 2개가 벡터에 넣어져야 하고 벡터에 들어가 있는 클래스의 멤버포인터 변수에 동적으로 메모리 할당하면 2개의 할당된 메모리가 있어야 하는거 아닌가요?
: : :
: : : 왜 그런지 모르겠습니다. 먼가 제가 놓치고 있는 부분이 있는거 같은데요...
: : :
: : : 어떤게 틀렸는지 알려주세요...
: : :
: : :
: : : -------------------------------------------------------------------------------------
: : : 클래스는 다음과 같구요..
: : :
: : : class TDataHandling_ECT
: : : {
: : : private :
: : : short *pHori;
: : : int m_nSize;
: : :
: : : public :
: : : TDataHandling_ECT()
: : : {
: : : pHori = NULL;
: : : m_nSize = 0;
: : : }
: : :
: : : ~TDataHandling_ECT()
: : : {
: : : delete [] pHori;
: : : }
: : :
: : : void CreateData(int nSize)
: : : {
: : : m_nSize = nSize;
: : :
: : : pHori = new short[nSize];
: : : }
: : :
: : : short* GetHori()
: : : {
: : : return pHori;
: : : }
: : : };
: : :
: : :
: : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : {
: : : vEct_Data.clear();
: : :
: : : TDataHandling_ECT var;
: : :
: : : vEct_Data.push_back(var);
: : :
: : : vEct_Data[0].CreateData(50);
: : : //(vEct_Data.back()).CreateData(50);
: : :
: : : for(int i = 0; i < 50; i++)
: : : (vEct_Data.back()).GetHori()[i] = i;
: : :
: : :
: : : TDataHandling_ECT var1;
: : :
: : : vEct_Data.push_back(var1);
: : :
: : : vEct_Data[1].CreateData(50);
: : : //(vEct_Data.back()).CreateData(50);
: : :
: : : if(vEct_Data[0].GetHori() == vEct_Data[1].GetHori())
: : : ShowMessage("Same");
: : : }
|