c++, 객체 포인터를 선언하고 delete 하면 malloc 에러가 나요
글쓴이: siruba / 작성시간: 화, 2012/08/28 - 9:03오후
Greg Perry의 아주 옛날 저서가 있어서 그걸 보면서 c++을 공부하고 있는데요,
예제 중에서 malloc 에러가 나는 코드가 있어서 질문드립니다. 가상함수를 설명하기 위한 과정에서 가상함수가 없는 상태의 코드이구요.
main 에서 delete 하지 않으면 에러가 나지 않습니다.
옛날 책이라 namespace 개념도 없고 해서 나름 필요한 부분에선 수정해 가며 하고는 있습니다.
고전 훑는 기분으로 보고 있습니다만, 현재 문법과 어떤 차이가 있는지 찾기가 쉽지 않네요. 최근의 책을 따로 하나 더 봐야하겠지요..
테스트 해 본 결과 자식 클래스 객체를 할당 하는 과정에서 레퍼런스가 아니라 new 로 할당하면 에러가 나지 않는걸 보니 이 부근의 문제인 것 같은데요..
정확하게 '진단명'이랄까, 레퍼런스로 할당할 때 어떤 문제가 발생하는 것인지 궁금합니다
테스트는 OSX lion, Ubuntu 에서 했습니다.
코드는 다음과 같습니다
#include "iostream" #include "iomanip" using namespace std; class Building { protected : int sqFt; char address[25]; public: Building(int, char []); void prData(void); }; Building::Building(int S, char A[]) : sqFt(S) { strcpy(address,A); } void Building::prData(void) { cout << "The building has " << sqFt << " spf" << endl; cout << "The building's address is " << address << ".\n\n"; } class Shed : public Building { char useCode; public: Shed(int, char[], char); }; Shed::Shed(int S, char A[], char U) : Building(S,A), useCode(U) {} class House : public Building { int numRooms; float cost; public: House(int, char[], int, float); void prData(void); }; House::House(int S, char A[], int N, float C) : Building(S,A), numRooms(N), cost(C) {} void House::prData(void) { cout << " The house has " << sqFt << " square feet." << endl; cout << " The house address is " << address << endl; cout << " The house has " << numRooms << " number of rooms." << endl; cout << " The house cost " << cost << "\n\n"; } class Office : public Building { int zoneCode; float rent; public: Office(int,char[],int,float); void prData(void); }; Office::Office(int S, char A[], int Z, float R) : Building(S,A), zoneCode(Z), rent(R) {} void Office::prData(void){ cout << "The office has " << sqFt << " sqf" << endl; cout << "The Office address is " << address << endl; cout << "The Office is zoned for " << zoneCode << " code" << endl; cout << "The Office rent for " << rent << "\n\n"; } int main() { Building * properties[3]; properties[0] = &Shed(78, "304 E. Tenth" , 'x'); properties[1] = &House(2310, "5706 S. Carmel", 8, 121344.00); properties[2] = &Office(1195, "5 High Rise" , 'B', 895.75); cout.precision(2); for(int ctr=0; ctr<3; ctr++){ properties[ctr]->prData(); } delete *properties[0]; delete *properties[1]; delete *properties[2]; return 0; }
Forums:
gilgil.net
를
바꿔 보세요.
www.gilgil.net
감사합니다
답변감사합니다. new 로 달았을 때 에러가 나지 않는 것은 확인 했습니다.
교재상에서 레퍼런스로 할당한 예가 원래 있었던 문법인데 지금은 사용하지 않는 문법인것인지 알 수가 없네요;;
교재가 좀 많이 오래되어서 단순히 오탈자인지 아니면 원래 있던 문법인지.. 교재를 바꾸던지 해야할까봐요...
완전히 초보가 아니라면, 이런 부분을 주의깊게
완전히 초보가 아니라면, 이런 부분을 주의깊게 생각하면서 공부하시면 내공이 더 쌓일지도 모르겠네요
피할 수 있을때 즐겨라! http://melotopia.net/b
제가 알기로는 malloc과 free가 짝이고,
제가 알기로는 malloc과 free가 짝이고, new와 delete가 짝으로 되어 있어서, 바꿔쓰면 혼난다고 들었네요...
피할 수 있을때 즐겨라! http://melotopia.net/b
감사합니다
답변감사합니다. new-delete 관해서는 알고 있었고 현재 사용중인 교재에서도 충분히 설명이 되어있는 부분이고 저자 또한 웬만하면 malloc은 쓰지 마라고 권하고 있는데도
본 예제에선 저런식으로 할당을 하고 있어서 좀 고민했습니다 ㅠㅠ
gilgil.net
참고로 말씀드리자면 C에서 malloc과 free는 memroy 관련 작동만 해 주는 반면에 C++에서는 memory 관리뿐만 아니라 다양한 작업을 하게 됩니다.
new가 호출되었을 때 : malloc이 호출됨 > 상위 클래스 constructor부터 순서대로 호출이 됨 > VMT 세팅이 됨.
delete가 호출되었을 때 : 하위 클래스 destructor부터 순서대로 호출이 됨 > free가 호출이 됨.
www.gilgil.net
properties[0] = &Shed(78,
스택에 임시객체들을 생성되는 것 같은데요. 이상한게 왼쪽이 const 레퍼런스도 아니라서 scope 끝까지 유지되는 것도 아니고, 각 statement가 끝날 때마다 임시객체들이 삭제될 것 같은데요.
예제가 틀린 듯. 예전 문법이라고 저게 제대로 작동하지는 않았을 것 같습니다.
그리고 virtual method table은 아예
그리고 virtual method table은 아예 생성되지도 않은 것 같네요. prData는 전부 Building에 정의된 것들이 불릴 듯. 물론 그 이전에, properties 0, 1, 2가 가리키고 있는 객체 내부 상태는 undefined 상태일 듯 하고요.
예제가 이상해요.
게다가 delete
게다가
properties[0]
은 Building에 대한 포인터인데, 이걸 다시 dereference한 것(=Building object)에다 delete operator를 적용하고 있네요? 컴파일이 안될 것 같은데..역시 예제가 이상해요 :)
댓글 달기