2012-11-07 3 views
3

표준 할당자를보다 강력한 할당 자로 바꾸고 싶습니다 (C++ 표준은 vector :: resize에 대한 오버플로 검사 만 필요함). 많은 라이브러리와 함께 제공되는 다양한 C++ 할당자는 네가티브 자체 테스트를 받으면 평평하게 떨어집니다.표준 C++ 할당자를 대체 하시겠습니까?

나는 더 강력한 할당자를 이용할 수 있습니다. ESAPI의 할당자는 오버플로를 검사 할뿐만 아니라 실수를 찾는 데 도움이되는 디버그 도구도 제공합니다. http://code.google.com/p/owasp-esapi-cplusplus/source/browse/trunk/esapi/util/zAllocator.h.

너무 많은 노력을 기울이지 않고 프로그램에서 사용되는 C++ 할당자를 대체 할 표준 방법이 있습니까? 나는 또한 소스 코드에 액세스하지 못할 수도있는 라이브러리 코드로 교체되도록하고 싶다.

+1

AFAIK 등의 AFAIK 스크립트를 변경할 수 있습니다. 모든 표준 컨테이너 생성자는 선택적 할당자를 사용합니다. – chris

+0

예. 모든 소스 파일의 모든 선언문을 방문하지 않고 게시판 전체를 대체하려면 어떻게해야합니까? – jww

+0

선언이 일관되면 꽤 쉽게 할 수있는 정규식이있을 것입니다. 그렇지 않은 경우에도 특정 불일치를 설명 할 수 있습니다. – chris

답변

3

동일한 서명이있는 다른 함수로 대체 될 수있는 라이브러리 함수 인 std::allocator과 달리, std::allocator은 클래스 템플릿이며 필요에 따라 템플릿 코드가 인스턴스화되어이를 사용하는 코드로 인라인됩니다. 일부 표준 라이브러리 코드는 이미 라이브러리의 오브젝트 파일에 컴파일되어 대체 할 수없는 인스턴스 코드 std::allocator 코드를 포함합니다. 따라서 표준 라이브러리가 std::allocator을 대체하는 비표준 방식을 제공한다면 유일한 방법입니다. 운좋게도 GCC의 libstdC++에서는 GCC가 구성되고 구축 될 때 사용되는 구현을 선택할 수있게 해주는 different choices

ESPI 할당자를 추가하기에는 너무 많은 작업이 필요하지 않습니다. GCC는 옵션 중 하나로 소스를 생성 한 다음, 구현자를 제공하는 std::allocator의 기본 클래스로 그 할당자를 사용하도록 GCC를 다시 빌드합니다. ESAPI 할당 자 코드를 조금 조정할 필요가 있습니다. libstdC++ configure 스크립트를 변경하여 --enable-libstdcxx-allocator=esapi

+0

쿨, 고마워요 조나단. "ESAPI 할당 자 코드를 약간 조정할 필요가 있습니다."- 얼마나 많은 도움을 주 었는지 고려하면 조정이 필요하지 않으면 놀라지 않을 것입니다. – jww

4

C++ 0x에서 std::vector 인 네임 스페이스 mystd의 새 템플릿 별칭을 사용자 지정 할당 자로 정의하십시오. std::vector을 모두 mystd::vector으로 바꿉니다. 코드에서 using namespace stdusing std::vector을 제거하십시오.

재생성. vector<T>의 원시 장소를 mystd::vector<T>으로 바꿉니다.

아, mystd보다 나은 이름을 사용하십시오.

+0

std :: allocator가 약하게 링크되어 있는가? 강하게 링크 된 심볼을 제공함으로써 끝낼 수 있습니까? – jww

+0

템플릿이 아니라 링크 할 수있는 심볼입니다. –

4

컨테이너 단위가 아닌 전역 단위로 할당을 수정하려는 경우 ::operator new::operator delete을 대체하려고합니다. 아마도 ::operator new[]::operator delete[]을 대체하고 싶을 수도 있습니다.하지만 배열을 할당하는 데만 사용됩니다. 거의 사용하지 않아야합니다 (별다른 생각이없는 경우를 제외하고는 : 아니오, 이들은 이 아니며이 아님). 어떤 식 으로든 배열과 다소 유사 함에도 불구하고 std::vector에 대해 메모리를 할당하는 데 사용됨).

라이브러리의 대부분을 대체하려고하지만 표준에서는이를 대체 할 수 있습니다. 누군가가 이미 특정 컨테이너에 대해 다른 할당을 지정하고, 그 할당이 (결국) ::operator new (또는 ::operator new[])를 통해 메모리를 얻을 수없는 경우 물론

,이 해당 컨테이너/그 용기에 영향을주지 것입니다.

+0

Jerry에게 감사드립니다. 나는 allocator와 같은 간단한 것을 위해 이것을 할 수있는 쉬운 방법이 없다고 생각한다. 다른 요소 삽입 점을 모두 쉽게 처리 할 수있는 방법이 없다는 것을 알고 있습니다. 내 통제하에있는 코드베이스에서 STL 코드를 금지 할 준비가되었습니다 (보안에 대한 대안이 있었으면합니다). – jww

+0

나중에 참조 할 사항 [여기에 연산자를 바꾸는 방법] (http://en.cppreference.com/w/cpp/memory/new/operator_new)을 참조하십시오. 여분의 경고가 없다면 아주 단순 해 보입니다. – Eonil