우리는 며칠 동안 이상한 사례를 디버깅 해왔고 버그를 다소 고립 시켰지만 여전히 의미가 없습니다. 어쩌면 여기에있는 누구라도 나에게 무슨 일이 일어나고 있는지에 대한 단서를 줄 수 있습니다.개체를 스택에서 생성하기 전에 unwind 될 수 있습니까?
문제는 코드 일부에서 발생하는 액세스 위반입니다.
는 기본적으로 우리는 다음과 같이 있습니다
void aclass::somefunc() {
try {
erroneous_member_function(*someptr);
}
catch (AnException) {
}
}
void aclass::erroneous_member_function(const SomeObject& ref) {
// { //<--scope here error goes away
LargeObject obj = Singleton()->Object.someLargeObj; //<-remove this error goes away
//DummyDestruct dummy1//<-- this is not destroyed before the unreachable
throw AnException();
// } //<--end scope here error goes away
UnreachableClass unreachable; //<- remove this, and the error goes away
DummyDestruct dummy2; //<- destructor of this object is called!
}
이상한 소멸자가 호출되기 전에이 UnreachableClass을 파괴한다, 그리고 나는 DummyDestruct 개체를 삽입 할 때이 파괴되지 않습니다 같은 디버거에서 실제로 보이는 동안 . 그래서 LargeObject의 파괴가 잘못 될 것 같지 않습니다.
이 모든 것은 프로덕션 코드 중간에 있으며, 작은 예제로 격리하는 것은 매우 어렵습니다.
내 질문은 무엇이 문제의 원인인지에 대한 단서가 있습니까? 꽤 완벽한 기능의 디버거를 사용할 수 있지만 (Embarcadero RAD 스튜디오), 이제는 어떻게해야 할 지 잘 모르겠습니다.
아무에게 나 진행 방법에 대한 조언을 줄 수 있습니까?
는 업데이트 :
은 내가 던져 절 아래에 DummyDestruct 오브젝트를 배치하고, 소멸자에서 중단 점을 배치. 이 객체의 소멸자가 입력됩니다 (이 코드에만 해당).
무엇을 연결할 수없는 상태에서 명시 적으로 생성자를 호출하면 어떻게됩니까? 일부 생성자가 사용되지 않는 한 로컬 변수는 선언 된 범위의 시작 부분에서 '초기화'된 것으로 생각합니다. – nothrow
오류는 무엇입니까? 어느 선이 그것을 일으키는가? – phtrivier
컴파일 할 때 어떤 최적화가 필요합니까? – Bill