2016-10-14 3 views
0

Microsoft는 디버그 빌드에서 누출 검사 장치를 사용할 때 수십 년 된 버그가 있습니다. 누수는 typeinfo.name()과 같은 C++ 유형 정보를 사용할 때 런타임 라이브러리에 의해 할당 된 것으로보고됩니다. Microsoft Connect의 Memory leaks reported by debug CRT inside typeinfo.name()도 참조하십시오.Microsoft typeinfo.name() 메모리 누수를 수정하는 방법은 무엇입니까?

거의 동일한 시간 동안 누출로 인해 오류 보고서와 사용자 목록 토론이 진행되었습니다. Microsoft 버그는 또한 사용자 프로그램의 실제 누수를 숨길 수 있습니다. 후자의 점은 마스킹 때문에 실제 문제를 돌봐 줄 수 없기 때문에 특히 걱정 스럽습니다.

typeid(T)typeinfo.name()의 사용으로 인해 누출을 스쿼시하려고합니다. 내 질문은 Microsoft의 버그를 어떻게 해결할 수 있을까요? 사용할 수있는 해결 방법이 있습니까?

+0

는 사용하지 마십시오 "파일 typeid_name_workaround.hpp"

template <typename T> struct get_type_name { static const char* name() const { static const char* ret=typeid(T).name(); return ret; } }; 

다른 .cpp/.hpp 파일'typeinfo.name (:

그래서 그 대신 typeid(<typename>) 사용하여, 당신은 같은 것을 사용)'? – Yakk

+0

샘 감사합니다. [소스 코드 라이센스] (http://www.google.com/search?q=license+microsoft+c%2B%2B+runtime+source+code)에 대한 정보를 찾을 수 없습니다. 링크가 있습니까? 또한이 경우 픽스는 어떻게 작동합니까? 모든 사용자가 라이선스를 취득 할 예정입니까? 아니면'.local' DLL 리다이렉션과 함께 사이드 바이 사이드 (side-by-side) 링크로 라이센스를주고 배포합니까? 후자는 실행 가능한 옵션처럼 보이지 않지만 프로세스를 이해할 수 있도록하고 싶습니다. – jww

+1

제안 : 당신이'typeinfo.name()'을 사용하고있는 모든 장소를 다시 방문하고 어떤 Meyer의 싱글 톤 함수 또는 템플릿이나 뭔가를 호출하도록 바꾸십시오 - 적어도 최소한 '누출'이있을 것입니다. 정적 변수. –

답변

1

Q의 의견에 대한 제 제안의 줄에.

if (valueType == typeid(int))를 들어 당신은 type_index (적어도 이후 C++ 11) type_info.name()를 들어


누출 메모리를 사용할 수 있습니다

것은 완전히 누출을 제거하는 것은 가능하지 않는 것 때문에를, 다음으로 좋은 한 가지 유형의 질문에 대해 유출 된 사람의 수를 줄이고보고 목적으로 태그를 추가하는 방법이 있습니다.
일부 템플릿 클래스에 속해 있으므로 '누출'보고서가 클래스 이름 (또는 할당이 발생한 소스 파일)을 사용하게되기를 기대할 수 있습니다.이 정보를 사용하여 이후에이 정보를 사용하여 '모든 누출 된 메모리 '보고서.

#include "typeid_name_workaround.hpp" 

struct dummy { 
}; 

int main() { 
    // instead of typeid(dummy).name() you use 
    get_type_name<dummy>::name(); 
} 
+0

애드리안에게 감사드립니다. 그것은 잘 작동하지 않았다. 보고 된 메모리 누수 건수는 32 건에서 40 건으로 증가했습니다. 임시 직원이 문제를 악화시킨 것 같습니다. 그래도 제안을 주셔서 감사합니다. – jww

+0

오, 글쎄, 뭐라 할 수 있니? 나는 단지 32 개의 '적절하지 않은 누출 (not-even-proper leaks)'(그 숫자가 시간이 지남에 따라 증가하지 않음)만으로 살 것입니다. 예, 프로그램을 종료하기 전에 메모리를 비우지 않고도 누출이라고 할 수 있습니다. 그러나 [모두가 메모리가 종료되기 전에 해제되어야한다는 데 동의하지는 않습니다.] (https://blogs.msdn.microsoft.com/oldnewthing/20120105-00/?p=8683) (... MSDN 블로그 항목, 놀랍 니? 나는이 버그에 대한 해결책이 될 때까지 숨을 멈추지 말라고 지시해야한다고 생각합니다. 건배. –

+0

Adrian에게 감사드립니다. 네, 전에는 "그 누수가 아닌"입장을 보았습니다. 다른 사람들이나 시험 결과에 영향을 미치지 않는 한 괜찮다고 생각합니다. 그러나이 경우 테스트를 방해하거나 누수를 숨김으로써 비 MS 코드에 영향을 미치므로 보안 버그 일 수 있습니다. 또한 코드가 DLL과 같은 라이브러리에서 사용되는 경우 Java 및 .Net과 같은 관리되는 언어에서 호출 될 때 메모리 누수가 증가 할 수 있습니다. Java 및 .Net은 DLL을 여러 번로드 및 언로드합니다. – jww

관련 문제