2

나는 내가이 중요한 규칙을 존중해야하므로이 MISRA 호환 하나 개의 프로그램을 구현해야C++ 메모리 관리 및 Misra는

.. 메모리 관리 및 MISRA 지침 C++에 대한 몇 가지 설명이 필요가 : 할 수 없습니다 'new'연산자 (동적 메모리 힙)를 사용하십시오. 생성자 Student(int age)로 나는 내 수업 Student

: 예를 들어

:

이 경우, 사용자 정의 개체에 대해, 나는 정적 할당을 사용해야합니다. 내가 이런 식으로해야 Student 객체 인스턴스화 할 때마다 :

int theAge = 18; 
Student exampleOfStudent(theAge); 

이는 학생 객체 exampleOfStudent를 만듭니다. 이렇게하면 소멸자를 사용하지 않는다고 걱정할 필요가 없습니다. 이 모든 것이 정확합니까? 정적 메모리 관리를 사용하는 다른 방법이 있습니까? std :: vector 또는 다른 데이터 구조와 같은 방식으로 사용할 수 있습니까? 예를 들어 Student exampleOfStudent (theAge)로 만든 Student 인스턴스를 std :: vector에 추가 할 수 있습니까?

+1

MISRA 규칙은 placement-new에서 무엇이라고 말합니까? –

+0

예 이것은 일반적인 개체 선언 방법입니다. 어느 컨트롤러에서 작업하고 있습니까?. 벡터는 타겟에 다르게 정의되어야하기 때문에 std :: vector가 타겟과 호환되는지 확인해야합니다. –

+0

@ Koushik이 경우 '컨트롤러'는 무엇을 의미합니까? – Safari

답변

2

Student exampleOfStudent(theAge);은 정적이 아닌 자동 변수입니다.

내가 기억하는 한, MISRA 규칙은 모든 형태의 동적 메모리를 허용하지 않습니다. 여기에는 mallocnewstd::vector (기본 할당자가 있음)이 모두 포함됩니다.

자동 변수와 정적 변수 만 남았습니다.

시스템의 RAM 용량이 제한되어 있으면 위험 할 수 있으므로 동적 메모리를 사용하지 않으려 고합니다. 사용 가능한 메모리보다 많은 메모리를 요청할 것입니다. 힙 분할도 문제입니다. 이렇게하면 올바른 코드를 작성할 수 없습니다. 자동 또는 정적 저장소에서 변수를 사용하는 경우 정적 분석 응용 프로그램은 예를 들어 응용 프로그램에서 사용할 최대 메모리 양을 출력 할 수 있습니다. 이 번호는 시스템 RAM에 대해 확인할 수 있습니다.

+0

+1 올리십시오 – Beryllium

0

한 번 나는 MISRA 규칙을 준수해야하는 라이브러리를 작성했습니다. 동적 메모리도 필요했기 때문에 트릭을 만들었습니다.

내 라이브러리는 C로 작성되었지만 트릭이 효과가있을 수 있습니다. 헤더 파일의

부분이 닮은 :

/* declare two function pointers compatible to malloc and free: */ 
typedef void * (*allocatorFunc)(size_t size); 
typedef void (*freeFunc)  (void * data); 

/* and let the library user pass them during lib-init: */ 
int library_init (allocatorFunc allocator, freeFunc deallocator); 

을 내가 직접의 malloc/무료 호출되지 않습니다 도서관 내부. 나는 항상 제공된 함수 포인터를 사용했다. 그래서 나는 동적 메모리 할당이 다른 누군가에게 어떻게 보이는지에 대한 문제를 위임했다.

고객이 실제로이 솔루션을 좋아했습니다. 그는 내 라이브러리가 동적 메모리 할당 없이는 작동하지 않으며 미리 할당 된 풀 또는 기타 등을 사용하여 자신의 메모리 스키마를 구현할 자유를 부여한다는 사실을 알고있었습니다.

C++에서도 동일한 작업을 수행 할 수 있습니다. malloc 함수를 사용하고 new를 사용하여 오브젝트를 생성하면됩니다.

+3

그것은 속임수입니다. 이것은 기술적 테스트를 통과 할 수 있지만 고객이 만족 스럽더라도 호환되지 않습니다. 문제는 힙 (heap)을 사용하지 않는 것이 중요하다는 것을 분명히 밝힙니다. 이것은 당신과 당신의 고객을 법적인 문제로 이끌 수 있습니다. 그리고 행복한 고객과 고객이이 접근 방식을 승인했다는 서면 진술 사이에는 큰 차이가 있습니다. – Beryllium

+0

죄송합니다 - 일을 잘못하는 것은 잘못입니다. 정말로 동적 할당을 사용해야하는 경우, 어쨌든 마이크로 컨트롤러에서 동적 메모리 관리없이 일반적으로 수행 할 수있는 힌트에 대해 편차를 – Andrew

0

MISRA를 준수하는 경우 동적 할당이 발생하지 않으므로 placement-new는 문제가되지 않습니다. 정적으로 할당 된 메모리 영역을 이러한 용도의 메모리 풀로 참조하는 방식으로 라이브러리를 작성할 수 있습니다 (STL 할당 자처럼). 장점 : 결정 성 있고 빠릅니다. 단점 : 메모리가 비효율적입니다. 결정 론적 실시간 시스템에 유리한 교환 조건. 프로그램을 시작할 때 필요한 RAM이 모두 있어야합니다. 그렇지 않으면 프로그램이 실행되지 않습니다. 프로그램이 시작되면 사용 가능한 힙 크기, 조각화 등의 영향을받지 않습니다.

자신의 할당자가 복잡하고 메모리 부족 조건 (정적 메모리 풀 크기는 결국 고정) 일 수 있습니다. 와.