이펙티브 C++에서는 소멸자에 Exception 걸어놔서 어디서 누수가 되는지 예방하라고 나와있던데,
VS17 에서 소멸자에 try catch 거니까 warning 뜨더라.
그냥 경고 무시하고 소멸자에 Exception 걸면 됨?
이펙티브 C++에서는 소멸자에 Exception 걸어놔서 어디서 누수가 되는지 예방하라고 나와있던데,
VS17 에서 소멸자에 try catch 거니까 warning 뜨더라.
그냥 경고 무시하고 소멸자에 Exception 걸면 됨?
crt 힙 메모리 누수되는거 알려주는 매크로 있음
어떻게 건다는 말임?
A 라는 클래스를 만들고 그 안에 int* apple라는 멤버 변수를 넣은 뒤, A()에 apple= new int; 를 하게 되면 나중에 ~A() 때 {delete(A);} 해야 되잖아 만약에 A를 소멸시키다가 예외가 발생하면, 어디서 예외가 발생했는지 발견하기 어려울 뿐더러, release로 실행 하면 별 전조증상 없이 끌때마다 메모리 누수가 발생하기 때문에 치명적일 수 있다고 ~A(){ try{delete(A)} catch(exception e){}} 를 권장한다던데
소멸자에 왜 예외를 던짐? 잘못 본거 아님?
A 라는 클래스를 만들고 그 안에 int* apple라는 멤버 변수를 넣은 뒤, A()에 apple= new int; 를 하게 되면 나중에 ~A() 때 {delete(A);} 해야 되잖아 만약에 A를 소멸시키다가 예외가 발생하면, 어디서 예외가 발생했는지 발견하기 어려울 뿐더러, release로 실행 하면 별 전조증상 없이 끌때마다 메모리 누수가 발생하기 때문에 치명적일 수 있다고 ~A(){ try{delete(A)} catch(exception e){}} 를 권장한다고 읽었음
아 delete(A)가 아니라 delete(apple)이다
의외로 delete()시에 예외가 발생할 경우가 많다고 하데, 그래서 스마트포인터 shared_ptr, weak_ptr(RAII)도 이거 방지하려고 나온거고
그건 소멸자에서 예외를 던지는게 아니라 소멸자에서 던져진 예외를 catch하는 거임. 소멸자에서 예외 던지면 좆됨.
ㅇㅋ 내가 설명을 잘 못했나봄
소멸자에 noexcept(false)를 명시적으로 지정하고 던져도 되는데 stack unwinding 중에 호출된 소멸자가 예외를 던지면 바로 terminate임
그래서 권장하는 방법은 아님
책이랑은 반대 의견이네 쨋든 ㄳㄳ