delete 관련 질문

sozu의 이미지

A *a = new A
...
...
B *b = (B *)a;
...
...
delete b;

sizeof(A) == sizeof(B) 라고 가정했을때

이와같은 코드에 문제가 없을까요?

ed.netdiver의 이미지

A와 B의 관계는요? B->A인가요? A->B인가요?

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

IsExist의 이미지

delete b를 하면 ~B() 함수가 호출되니 문제가 있어 보입니다.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

doldori의 이미지

A가 B의 자식 클래스이고 B의 소멸자가 가상이면 문제 없고(캐스팅도 필요없음)
그렇지 않으면 문제가 됩니다.

lovewar의 이미지

Quote:

sizeof(A) == sizeof(B) 라고 가정했을때

이것은 A와 B의 연관성이 없고 단지 같은 메모리 구조를 했다는 가정하에

C 스타일의 캐스팅을 했다고 본다면, 문제가 될것입니다.
같은 메모리를 가리키고 있고 그 공간을 해제했으니 문제가 되겠죠.

다른 각도에서 바로본다면 어떻게 될지 고수님들의 의견 바랍니다.

까막의 이미지

dynamic_cast<B*>(a) == 0 라면 문제가 될 공산이 매우 큽니다.

뭐 전부 primitive type에 레이아웃이 완전히 동일하다면, 컴파일러가 생성해주는 scalar destructor가 동일할테니 문제가 안생길수도 있겠네요.

음. 이런것때문에 (B*) 즉 C-style casting을 하지 말라는 이야기가 나오나봅니다. :)

Crow's Maniacal World.
http://crowmania.cafe24.com

Let's be engineers!

ed.netdiver의 이미지

doldori님 말씀이 맞다고 생각합니다.
덧붙이면 instance의 memory 점유 size가 같더라도 A, B가 파생관계가 없는 생면부지의 class라면, 소멸자가 단지 메모리를 해제하는 것만이 아닌 이상
다른 resource의 해제까지 생까버리는 맘아픈 상황이 일어나게 되지 않을까요?
예를 들면 handle이랄지...

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

sozu의 이미지

답변 감사드립니다.

제 경우에는 레이아웃이 동일하며 소멸자에서는 하는일이 없기때문에 문제가 없을것이라고 결론 지었습니다. :D

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

happyjun의 이미지

sozu wrote:
답변 감사드립니다.

제 경우에는 레이아웃이 동일하며 소멸자에서는 하는일이 없기때문에 문제가 없을것이라고 결론 지었습니다. :D

잘못된 결론입니다.

----------------------------------------
http://moim.at
http://mkhq.co.kr

unipro의 이미지

클래스 A, B의 관계는 무엇입니까?

어느 한쪽이 다른 한쪽에게 상속하는 관계입니까?

둘다 공통의 클래스로부터 상속받는 것입니까?

아니면 전혀 관계가 없습니까?

그밖에 다른 관계 입니까?

내 블로그: http://unipro.tistory.com

익명 사용자의 이미지

파괴자가 가상함수일경우에는 문제가 없을듯 해 보이는군요...
혹시 그렇지 않다면. 어떠한 반론이 나올 수 있을지..
(이미 하나 짐작가는게 있긴 합니다만. 다른분들의 생각을 보고 싶군요..)

htna의 이미지

파괴자가 가상함수일경우에는 문제가 없을듯 해 보이는군요...
혹시 그렇지 않다면. 어떠한 반론이 나올 수 있을지..
(이미 하나 짐작가는게 있긴 합니다만. 다른분들의 생각을 보고 싶군요..)

WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra

myueho의 이미지

포인터에 대한 케스팅이므로 상속관계가 아니라도 컴파일에러가 아닙니다.

댓글 달기

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