위치지정 new에 대응되는 delete를 main에서 직접 호출하는 방법은 뭔가요?
글쓴이: dltkddyd / 작성시간: 일, 2014/06/08 - 1:36오후
svoid* operator new(std::size_t, double m);
void operator delete(void* pt, double m);
위치지정 new와 그에 대응되는 delete를 클래스 내부에 선언하고 정의했습니다. 그리고 new는
new(95.67) Base;
라 호출했습니다. 이건 제대로 호출이 됩니다. 그런데 그에 대응되는 delete
void operator delete(void* pt, double m);
어떻게 호출해야 하나요. 이 함수는 런타임 시스템만 호출할 수 있는 것인가요?
아래는 이를 테스트하기 위해 사용한 소스입니다.
-test6.h-
#include <cstddef> template<class T, unsigned int _length> class Base { public: T* pt; Base(); void* operator new(std::size_t size); void* operator new[](std::size_t size); void operator delete(void* pt,std::size_t size); void operator delete[](void* pt, std::size_t size); void* operator new(std::size_t, double m);//이 new 연산자에 대하여 void operator delete(void* pt, double m);//이 대응되는 delete 연산자가 호출되도록 했는데 안 되는군요. }; template<class T, unsigned int _length> class Derived:public Base<T,_length> { public: using Base<T,_length>::pt; T& operator[](unsigned int _index); }; template<class T, unsigned int _length> T& Derived<T,_length>::operator[](unsigned int _index) { //return Base<T,_length>::pt[_index]; return pt[_index]; } template<class T, unsigned int _length> Base<T,_length>::Base() { pt=new T[_length]; } template<class T, unsigned int _length> void* Base<T,_length>::operator new(size_t size) { cout<<"new"<<endl; return ::operator new(size); } template<class T, unsigned int _length> void* Base<T, _length>::operator new[](std::size_t size) { cout<<"void* operator new[](std::size_t size)"<<endl; return ::operator new[](size); } template<class T, unsigned int _length> void Base<T,_length>::operator delete(void* pt,size_t size) { cout<<"delete"<<endl; ::operator delete(pt); } template<class T, unsigned int _length> void Base<T, _length>::operator delete[](void* pt, size_t size) { cout<<"void operator delete[](void* pt)"<<endl; ::operator delete[](pt); } template<class T, unsigned int _length> void* Base<T,_length>::operator new(std::size_t size, double m) { cout<<"void operator new(std::size_t, int m) "<<m<<endl; ::operator new(size); } template<class T, unsigned int _length> void Base<T,_length>::operator delete(void* pt, double m) { cout<<"void operator delete(void* pt, int m) "<<m<<endl; ::operator delete(pt); }
-test6.cc-
#include <iostream> using namespace std; #include "test6.h" int main() { /*Base<int,5> *ptr=new Base<int,5>[3]; unsigned int k=0; for(Base<int,5>* i=ptr;i!=ptr+3;i++) { for(int* j=(*i).pt;j!=(*i).pt+5;j++) { *j=k++; } } for(Base<int,5>* i=ptr;i!=ptr+3;i++) { for(int* j=(*i).pt;j!=(*i).pt+5;j++) { cout<<*j<<endl; } } delete[] ptr;*/ Base<int,10>* ptr2=new (90.56) Base<int,10>;//이 행은 정상인데 //delete(90.56) ptr2;//이 행에서 static void operator delete(void* pt, double m)이 호출되지 않습니다. return 0; }
Forums:
c++ placement new 검색해봐
c++ placement new
검색해봐
한글도 못 읽나.
아래 뭐라고 썼냐? 해결했다고 했지. 난독증입니까? 참 답변 달지 않아도 괜찮다고 했잤니. 무시 받으면서도 계속 답변은 달고. 그게 당신의 문제입니다. 인정에 굶주린 가엾은 X같군요. 그리고 저건 답변이랄 수도 없는거고. 그러니 무시 받는 겁니다. 아셨죠? 알면 왜 호출되지 않는지 설명해보시던가. 난 아래 언급했듯이 답을 이미 알고 있어요.
그리고 먼저 썼던 글에 답변에서 제가 반말을 썼다고 했죠? 그런데 제가 한 그 말들 표준어입니다. 국어사전 찾아보세요.
그리고 님의 링크는 그쪽이나 실컷 찾아보세요.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
음.. 위는 제가 아니고요. 진정하시고요. 어차피
음.. 위는 제가 아니고요. 진정하시고요.
어차피 서로 다만 피장 파장이라 생각했을 뿐 전 누가 먼저 시작했냐 따질 생각 없었고요. 그냥 님이 제가 먼저 시작해놓고 오리발 내밀었다 하시니까 저도 억울해서 찾아드린거죠. 하여간 그만 할테니 진정하세요.
원하시면 다 찾아드리죠.
원하시면 다 찾아드리죠.
책 뒤에 그 해답이 있었군요.
책을 보면 바로 바로 의문이 생기는 부분을 먼저 시험하다 보니 간혹 뒷 부분의 설명을 보지 못하는 경우가 생기는군요. 책 뒤에 이에 대한 해답이 있었는데요.
Effective C++ p374
위치지정 delete가 호출되는 경우는 위치지정 new의 호출에 '묻어서' 함께 호출되는 생성자에서 예외가 발생할 때뿐입니다.
이렇게 설명하고 있군요. 지우려고 했는데 또 못 지우는군요. 그리고 이 책 읽으라고 권하신 분에게 감사하다는 말씀 드려야겠습니다. 처음에는 코드가 별로 없길래 '이게 뭐야! 코드도 없고. 설명이 너무 빈약한 것 아니야.'라고 생각했는데. 읽을 수록 모르고 간과할 수 있는 치명적인 실수에 대해 언급을 많이 해놓으셨더군요. 모르면 독이 되는 것들에 대해서요.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
읽으라고는 제가 한것 같은데요... 한장 읽을때마다
읽으라고는 제가 한것 같은데요... 한장 읽을때마다 기초적인 질문을 양산하는걸 보니 제가 잘못한 느낌입니다. EC++은 C++에 대한 스킬에 대한 책이고요, 님은 일단 메모리라던가 운영체제라던가 하는 기본적인 개념을 좀더 공부를 하셨으면 합니다.
동감. 주화입마에 빠진듯.
동감. 주화입마에 빠진듯.
익명은 닥쳐라.
XXX같이 놀지 말고.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
ㅎㅎㅎ
XXX라 했으니 비속어가 아닙니다.
닥쳐라는 국어사전에 있는 말입니다.
tunecolor는 오프라인에서도 떳떳하게 밝힐 수 있는 아이디입니다.
angel
angel님이죠. ㅋ. 그런데 언제까지 꼬리물기 해야하나요. 날도 더운데, 저 분은 안 지치나.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
그리고 추가하자면 운영체제가 메모리 할당하는 방식을
그리고 추가하자면 운영체제가 메모리 할당하는 방식을 모르는 사람이 짠 placement new를 저라면 절대 쓰고싶지 않네요...
쓰라고 안 권합니다. 혼자 만들어서 쓰면 써도.
업그레이드 해서 쓰면 써도 배포는 안 합니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
님께서 뭐라고 느끼셨든지간에.
여하튼 이 책 도움이 많이 됐습니다. 님의 느낌이 중요한 건 아니죠. 그 책을 받아들이는 사람이 어떻게 받아들이느냐가 중요한 것이지. 그리고 메모리, 운영체제 공부를 해야할 필요는 느낍니다만 먼저 해야할 일이 있기에 .. 여하튼 권해주신 책 감사하고, 충고도 감사하게 받죠.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
https://kldp.org/node/143019#
https://kldp.org/node/143019#comment-604382
저건 Effective C++ 읽기 전 상태군요.
ㅋ. 저건 캐리님이 저 책 읽으라고 권하시기 전이군요. 좋은 책은 좋은 벗보다 더 반갑다. 솔직히 책 읽고 저도 많이 웃었습니다. 여하튼 잘못 된 방식이 무엇인지 알게 되어 다행이라고 해야겠군요. 링크 거신 글 올리신 분인가 보군요. 요 아래 욕설도?
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
https://kldp.org/node/142862#
https://kldp.org/node/142862#comment-604133 5/17
https://kldp.org/node/143019#comment-604382 5/27
가상함수 다시 읽어보기 전이었군요.
그 때가 문법책 가상함수편 읽기 전이었을 겁니다. STL의 container는 비가상함수만 있기 때문에 상속해서 오버라이딩할 수 없는 경우라고 책에 나와있네요. 포인터에서 실질적으로 가리키는 대상의 함수로 호출될 수 없는 문제가 발생한다는 것이었고요. container는 가능한 상속받지 않는 것이 낫고, 상속받더라고 오버라이딩을 하지 말아야 겠습니다.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
엮여 언급되신 분껜 정말 죄송..
자존감이 높은 사람: (평소 이런 상황을 아예 만들지 않는다)
자존감이 뭔지 아는 사람: (얼굴이 화끈거리며) 제가 저랬었군요. 그땐 미안했습니다. '앞으론 그러지 말아야지'
천상천하 유아독존: '이 XXX가 날 쫓아내려 드는구나.' (울그락 불그락 애써 웃으며) 그건 ~~~ 라서 그렇지. (상황을 모면하려 앞뒤가 안 맞는 거짓말을 늘어놓는다)
여하튼 익명은 별로.. 무슨 답변을 달든지.
답변 달아달라고 강요한 적도 없을 뿐더러 익명이 단 답글은 왠지 불쾌하기까지 하더군요. 남의 마음 상태롤 지례짐작으로 함부로 말하고. 님은 제 셋 중에 어떤 부류라 생각하시는지? 그쪽도 역시 만만찮아요. 본인이 조금 아는 것으로 남을 무시하려는 자세는 저 셋 중에 어떤 경우에 해당하는지 생각해보셔야 겠습니다. 여기서 이런 험담이 무슨 소용이 있다고 그러는지. 책 권해주신 분께 감사하다고 말했어도 그 감사도 못 받는 수준이라면 욕 먹으라고 해야할까요? 좋은 말을 해줘도 딴지 거는 버릇이 있는 사람은 계속 그 습성이 남아서 그런 짓을 해댑니다. 요 앞 글 보세요. 글을 보고도 헤아리지 못하는 사람이 누굴 가르치려 듭니까? 그냥 편히 쉬세요. 그쪽은 천상천하 유아독존 자존감이 높은 사람이신가보군요? 이리 남의 말에 의존적인 것을 보면. 열 잘 받는 다혈질이군요. 그리고 당신 같은 사람은 편협해서 설사 상대방이 실수하고 사과했다 해도 더 무시하면 했지 너그럽게 수용할 수 있는 그런 유형의 사람은 아닌 것으로 보입니다. 개구리 올챙이적 생각 못하겠지.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
본심이 막 나오는 거 보니 엮여 언급되신 분께 정말로 죄송
:(
진짜 못봐주겠다..
둘 다.. 진짜 가관이다..
아무데나 대들더니 필요할 때만 만만한 놈 없나 지 편 찾는 거 봐라.. 누굴 바보로 아나
저런 것들 많이 봤다.. 한 번 울면 다들 벙쪄서 그냥 넘어가고 ㅋㅋ 정치적으로 잔머리나 굴리기나하지
다들 그러는 건 이유가 있는 거지 혼자 지롤하던 저 찐따놈도 꼴깝하더니 ㅋ 벽이 어째? 속셈 빤하다 그래놓고 KLDP가 어쩌고 ㅋㅋㅋ 어련히 알아서들 할 건데
세상에 자기들만 다 옳고 피해자지ㅋ 입만 살아선 며칠 동안 쇼를 하더니
다른 사람은 생각도 안하나
여긴 머하러 오는 건지..
아주 재밌어.. 상종을 말아야지..
고만 하시지요.
고만 하시지요.
그쪽이나 오지 마세요.
그리고 당신 약 먹은 사람 같네요. 비속어나 남발하는 사람에게 무슨 답변을 기대하겠습니까? 오고 말고는 내 마음이에요. 너나 오지 마세요. 아셨죠? 벙찌다는 뭐고. 울긴 누가 울고. 여기서 누가 정치를 하나. 저런 사람을 본보기로 삼아 경계하는 마음을 갖고 살아야겠습니다. 말복도 아닌데 벌써부터 그러면 말복을 어찌 지내려고.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
수수께끼입니다.
맞기도 전에 겁먹는 놈은
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
찐따한테도 맞는 놈.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
댓글 달기