2011-08-19 6 views
3

Visual C++ 6.0에서 VC++ 9.0 (2008)으로 이식 된 레거시 코드로 작업하고 있습니다. 프리 프로세서 정의 _CRT_SECURE_NO_WARNINGS을 사용하여 보안 CRT 경고를 비활성화했습니다. 그러나 그로 인해 std::vector 소멸자에서 충돌이 발생합니다.벡터 소멸자에서 _CRT_SECURE_NO_WARNINGS가 충돌로 이어집니다.

_CRT_SECURE_NO_WARNINGS을 사용하는 데 문제가 있습니까?

+0

힙 손상에는 바이트 처리를위한 전 처리기 정의가 필요하지 않습니다. –

답변

1

어떻게 부숴 지나요? 벡터에서 메모리를 덮어 쓰는 한 위치의 메모리를 얻은 다음 벡터가 해제되기 전에 메모리를 해제하는 것처럼 들립니다. 나는 포인터로 어떤 곳을 바라 볼 것이다. 표준 호환 컴파일러를 사용 중이므로 boost 포인터 또는 부스트 배열로 대체하십시오. 반복자를 사용하는 것이 더 안전 할 포인터 연산에 대한 필요성을 없애기위한 것.

+0

코드가 제 3 자로부터 작성 및 라이센스되었으므로 부스트/변경 코드를 너무 많이 사용할 수있는 위치에 있지 않습니다. – sarat

+1

VC++ 6.0의 문제점은 비표준 호환 컴파일러라는 것입니다. 하나에서 다른쪽으로 이식 할 때 문제가 발생할 것입니다. VS2008에서 VC++ 6.0 컴파일 된 dll이나 lib를 호출하려고한다면 판도라의 상자를 열어서 문제를 일으킬 수도 있습니다. 가능한 한 많은 포인터 영역을 제거하고 제거하십시오. 이전 코드가 잘못되어 지금까지 작동하지 않았을 수 있습니다. 그것이 메모리 문제가 때때로 작동하는 방식입니다 ... – wheaties

+0

@sarat : 그래서 문제는 무엇으로 판명 났습니까? –

1

이는 서로 관련이없는 문제입니다. _CRT_SECURE_NO_WARNINGS은 지원 중단 경고 만 표시하며 프로그램 동작을 변경하지 않습니다. 실제 문제를 디버깅해야합니다.

1

당신은 확실히 "일하게"하는 방법에 대해 빠르고 더러운 해결책이 필요한 사람들 중 하나입니다. 나쁜 접근. 경고를 숨기려면 지시문을 정의하지 말고 대신 코드에 모든 경고 (수준 4 - /W4)를 사용하고 부지런히 모두 제거하십시오. 가능한 모든 경고와 부작용을 제거하여 코드를보다 강력하게 만듭니다.

VC6과 최신 VC 컴파일러 간에는 큰 차이가 있습니다. VC6에서 완벽하게 작동 한 것은 현재 작동하지 않을 수 있으며 최신 컴파일러의 잘못이 아니라 코드의 오류입니다. 컴파일러/디버거는 개발/디버깅 단계에서 결함을 조기에 발견하는 데 도움을줍니다.

정적 분석 (코드 분석은 Visual Studio의 상위 버전에서 /analyze 스위치를 사용하는 것과 같음)을 실행하는 것이 좋습니다. 더 많은 문제를 찾으려면 코드에서 동적 코드 분석을 실행해야합니다.