수동으로 메모리를 비우고 파일을 닫는 것과 같은 것을 의미합니까? 그렇다면, 내가 "메모리 관리"뿐만 아니라 "자원 관리"로 일반화하는 경우, 내가 사용했던 대부분의 다른 언어보다 최소 및 일반적으로 더 적습니다. 그런 의미에서, 실제로 C ++은 Java 나 C #보다 수동 리소스 관리가 덜 필요하다고 생각합니다.
주로 리소스 (메모리 또는 기타) 파괴를 자동화하는 소멸자 때문입니다. 일반적으로 C ++에서 수동으로 리소스를 해제 / 파괴 해야하는 유일한 시간은 vlow-level 데이터 구조 (대부분의 사람들이 필요하지 않은 것)를 구현하거나 약간의 시간을 보내는 C API를 사용하는 경우입니다. 수동으로 해제 / 파기 / 폐쇄해야하는 C 리소스를 RAII 준수 C ++ 래퍼로 래핑합니다.
물론 사용자가 이미지 편집 소프트웨어에서 이미지를 닫으라고 요청하면 컬렉션이나 무언가에서 이미지를 제거해야합니다. 그러나이 상황에서 중요한 종류의 "메모리"또는 "리소스"관리로 간주되지 않기를 바랍니다. 그 시점에서 해당 이미지와 관련된 메모리를 해제하려면 모든 언어에서 거의 필요하기 때문입니다. 그러나 다시해야 할 일은 컬렉션에서 이미지를 제거하고 이미지 소멸자가 나머지를 처리하는 것입니다.
한편, Java 또는 C #과 비교할 때 수동으로 파일을 닫고, 소켓을 수동으로 연결 해제하고, 객체 참조를 null로 설정하여 가비지 수집이 가능하도록하는 경우가 많습니다. 수동 메모리가 훨씬 더 많습니다. 당신이 저에게 요구하면 그 언어로 자원 관리. unlock
뮤텍스 로커는 뮤텍스가 범위를 벗어날 때 자동으로 그렇게하기 때문에 C ++에서는 종종 수동으로 뮤텍스 가 필요하지 않습니다 . 예를 들어 C ++에서 이와 같은 작업을 수행 할 필요는 없습니다.
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
C ++에서 파일을 수동으로 닫는 것과 같은 작업을 수행 할 필요가 없습니다. 결과적으로 범위를 벗어나 든 정상 또는 예외적 인 실행 경로인지에 상관없이 범위를 벗어나는 순간 자동으로 종료됩니다. 같은 메모리 관련 리소스와 비슷한 것 std::vector
. file.Close()
위와 같은 코드 는 종종 finally
블록 의 맥락에서 찌그러 질 것 입니다. 이는 C ++에 대한 전체 사고 방식이 자동화 할 때 로컬 리소스를 수동으로 해제해야 함을 나타냅니다.
수동 메모리 관리 측면에서 C에는 최대 값, Java / C #에는 중간 정도의 양, C ++에는 최소값이 필요합니다. 마스터하기에는 매우 어려운 언어이기 때문에 C ++을 사용하는 데 약간 부끄러운 이유가 많이 있지만 메모리 관리가 그중 하나가되어서는 안됩니다. 반대로 나는 실제로 이것이 한 측면에서 가장 쉬운 언어 중 하나라고 생각합니다.
물론 C ++에서는 수동으로 메모리를 할당하고 수동으로 메모리를 확보 operator delete/delete[]
하기 위해 호출 할 수 있습니다. 그것은 또한 당신이 좋아하는 C의 기능을 사용할 수 있습니다 malloc
및free
. 그러나 Stroustrup이 RAII를 초창기 전에 RAII를 옹호하기 시작한 이래로 사람들이 신용을주기 훨씬 전에 쓸모 없게 된 일종의 고대 스타일 코딩 관행입니다. "모던 C ++"이 자원 관리를 자동화한다고 말하는 것이 공정하다고 생각조차하지 않습니다. 왜냐하면 그것이 모든 목적이되어야하기 때문입니다. 그렇지 않으면 실제로 예외 안전을 얻을 수 없습니다. 90 년대 초반 많은 오도 된 개발자들이 C와 마찬가지로 C ++을 객체와 함께 사용하려고했지만 종종 예외 처리를 완전히 무시했지만 결코 그런 식으로 사용되지는 않았습니다. 실제로 항상 사용하려는 방식으로 C ++를 사용하는 경우 메모리 관리는 완전히 자동화되어 있으며 일반적으로 수동으로 처리해야하거나 전혀 처리하지 않아도됩니다.