2016-06-07 4 views
0

1) cli에서 다음 코드에 대한 포인터 유효성 검사가 필요합니까? 좋은 점이 있습니까?gcnew에 대한 포인터 유효성 검사를 생성해야합니까?

NameClass NameString^ = gcnew NameClass(); 

if (NameClass) 
{ 
    // some process 

2) 우리는 하나의 함수에서 메모리를 생성하고 다른 포인터로 전달하면 우리가 검증을해야합니까?

foo() 
{ 
    try { 
     NameClass *pNameString = new NameClass(); 
     foo_2(pNameString); 
     } catch(std::bad_alloc &error) 
     { 
      std::cout << error.what() << std::endl; 
     } 
} 

foo_2(NameClass *pNameString) 
{ 
    if (pNameString) // do we need to validate here ? 
    { 
    // some stuff 
    } 
} 

3) 참조 전달시 로컬로 생성 된 개체의 유효성을 검사해야합니까?

NameClass objNameClass; 
foo(&objNameClass); 

foo(NameClass *objNameClass) 
{ 
    if (objNameClass) // do we need to validate here ? 
    { 

답변

1

그것이 new 후 단지로 gcnew 정당한 후 불필요한 대로입니다. 웬일인지 malloc과 같은 C 할당자를 사용하는 경우에만 필요합니다. C++ 및 C++/CLI 구문은 null 포인터를 반환하는 C 함수와 달리 실패한 개체 생성에 대한 예외를 사용합니다.

보통 C++에서 메모리를 할당 할 수없는 경우 newstd::bad_alloc을 반환합니다. C++/CLI에서 gcnew은이 경우 System::OutOfMemoryException을 반환합니다.

대부분의 경우 어쨌든 어쩌면 운명 일 것이므로 예외가 전파되어 프로그램이 종료되도록해야합니다. 두 번째 예에서


, 당신 수도 당신이 누군가가 널 포인터로 foo_2를 호출 할 것으로 예상 경우에만 foo_2에 포인터를 유효성을 검사 할, 그것은 올바른 사용이됩니다. 인수로 널 포인터를 전달하는 것이 유효하지 않은 경우 버그가 발생하여 응용 프로그램이 (예를 들어 데이터를 손상시키지 않고) 충돌하게해야합니다. foo_2을 할당 직후에 호출하는 코드에서만 볼 수 있다면 null이되지 않으므로 불필요합니다.

세 번째 예제와 동일합니다. 함수의 계약/문서에는 null 포인터로 호출 할 수 있는지 여부와 그 동작 방법을 지정해야합니다.

주세요이제까지가 쓰기하지 않습니다

catch(std::bad_alloc &error) { std::cout << error.what() << std::endl; } 

정기적 객체 할당에 메모리 부족 조건이있는 경우

, 그냥 프로그램 다이를 할 수 있습니다. 그런 식으로 치유하려고하면 아주 멀리 가지 못할 것입니다.

이러한 코드를 사용할 수있는 유일한 곳은 잠재적으로 큰 배열을 동적으로 할당하려고 할 때입니다. 수행 할 수없는 경우 해당 작업을 취소 할 수 있음을 알 수 있습니다. 모든 할당에 대한 할당 오류를 포착하지 마십시오. 코드가 부풀어 오르고 아무 것도 이끌지 못할 것입니다.

관련 문제