2016-12-24 14 views
2

Delphi에서 만든 일부 프로젝트를 번역하려고합니다. 객체로 일반적으로 선언 할 수 있습니다 : C에 대한스택 및 힙의 C++ 객체 수명

//I have the control of the object and I MUST delete it when it's not needed anymore 

male := THuman.Create(); 
try 
// code 
finally 
male.Free; (get rid of the object) 
end; 

읽기 스트로브 스트 룹의 책 ++ 나는 항상 해결 방법이 있기 때문에 (짧은) 자신의 언어가 finally 블록을 필요로하지 않는다는 것을 이해했다. 블록 {... code ...}

  • THuman* male = new THuman 나는 개체의 수명을 제어 할 수 있습니다 종료 될 때 개체가 다음 생성되는

    1. THuman male; 범위를 벗어나 : 나는 클래스를 만들려면 지금은 두 가지 방법이 그리고이 책은 첫 번째 방법을 사용하여 제안하는 delete


    (경우에도 로봇과 그것을 파괴 h는 괜찮습니다.)하지만 델파이 배경에서 왔고 두 번째 방법을 사용하고 싶습니다 (객체의 제어권을가집니다).

    질문 C++에서 객체에 대해 가지고있는 두 가지 메소드의 차이점을 이해할 수 없으며, 온라인으로 읽기가 더 혼란 스럽습니다. 방법 1이 스택에 메모리를 할당하고 힙에서 방법 2를 할당한다고 말하면 정확합니까?

    NULL 값을 객체에 할당하면 방법 2 (우리는 힙에 있음)에서 삭제를 호출해야합니까?

    예를 들어 델파이는 힙에서만 인스턴스를 만들 수 있으며 Free은 개체를 삭제합니다 (C++에서는 delete).

  • +0

    https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization –

    +1

    [C++ 객체의 수명주기 란 무엇입니까?] (http://stackoverflow.com/questions/17121305/what-is-the- – Borgleader

    +1

    가능한 한 포인터 및 동적 할당을 사용하지 마십시오. 당신이 그들을 잘 이해하지 못한다면 그들은 문제와 이상한 행동으로 이끌 것입니다. 자동 저장 ("스택"에 대한 로컬 변수)은 안전하며 현재 (또는 중첩 된) 블록 내에서만 변수가 필요하면 잘 작동합니다. 현대 C++에서는 다형성을 제외하고는 포인터에 대한 필요성이 거의 없습니다. –

    답변

    3

    자동 수명이 (당신이 말한대로 스택에 생성을하지만 대부분의 컴파일러에 의해 선택된 구현 기술이다) 그들이 밖으로 이동하면, 그들은 자동으로 해제된다 범위.

    2 - new (대부분의 컴파일러의 구현 기술로서 힙에서 생성 된)으로 생성 된 객체의 수명은 프로그래머가 관리해야합니다. 삭제는 포인터를 NULL로 설정하는 것이 아니라 이전에 발생해야합니다. 간단한 규칙은 :

    new 하나와 일치해야
    • 하나 뿐인 delete
    • new[] (동적 배열의 생성)을 하나 하나 뿐인 delete[]

    PS 일치해야 이 일치하면은 프로그램의 런타임에서 1 대 1 발생과 관련이 있습니다. 코드 자체가 아니기 때문에 (개체를 언제 어디서 삭제할지 제어 할 수 있습니다).

    +0

    C++에서는 일반적으로 포인터를 사용하지 않는 것이 좋습니다. 왜냐하면 포인터는 더 "C 스타일"입니다. –

    +0

    @RaffaeleRossi 이것은 의견을 기반으로합니다. 일부는 그렇게 말할 것입니다. 다른 사람들 (나 같은)은 매우 강력한 관용어로서 포인터를 자유롭게 사용할 수 있다고 말할 것입니다. 다른 것들은 스마트 포인터의 사용을 촉진 할 것이지만 IMO는 다른 관심사입니다. –

    +0

    그래서 산악 자전거 나 도시 자전거가있는 것과 같다고 말할 수 있습니까? 둘 다 똑같지 만 사람들이 필요로하는 용도에 따라 둘 중 하나를 선호합니다. –

    2

    그 방법 1이 스택에 메모리를 할당하고 힙에서 방법 2를 사용한다고 말하면 정확합니까?

    • 예 방법이 (우리가 힙에있어) 내가 개체에 NULL 값을 할당하는 경우에

    , 나는 여전히 삭제 전화를해야합니까?

    • 원시 포인터 대신 smartpointers를 사용하는 것이 좋습니다. Smartpointer는 포인터 리소스를 처리하고 더 안전하게 사용할 수 있도록하는 개체입니다. 그러나 스마트 포인터를 사용할 수없는 경우 포인터에 delete을 호출하여 NULL을 할당하기 전에 힙에서 이전에 할당 된 메모리를 해제해야합니다. 그렇지 않으면 누출 된 리소스가 생깁니다. 당신이 방법이 (우리가 힙에있어) 내가 개체에 NULL 값을 할당하는 경우에 valgrind
    +0

    "yes"라고 말하면, 방법 1의 경우 일부 저장소가 스택에 할당되고 개체 생성자가 힙에 더 많은 양을 할당 할 수 있다는 것을 명확히해야합니다. –

    +0

    또한 C++ 사양에서는 로컬 변수가 "스택"에 저장된다고 구체적으로 언급하지 않습니다. 로컬 변수를 처리하는 가장 일반적인 방법이지만 C++ 사양에서는 "자동"저장소 만 있다고합니다. 컴파일러는 로컬 변수를 다르게 저장하도록 선택할 수 있습니다. –

    2

    를 실행할 수있는 프로그램 메모리 관리를 확인하려면, 난 여전히 삭제 전화를해야합니까?

    삭제하기 전에 메모리를 유출했는지 확인하고 NULL 포인터에서 삭제를 호출하면 seg 오류 (응용 프로그램 충돌)가 발생합니다.

    가장 좋은 방법은 스택 개체를 사용하는 것입니다. 그러나 개체의 존재를 관리해야하는 경우 위에 제안 된 스마트 포인터 (unique_ptr, shared_ptr)를 사용하십시오.

    참고 : "유출 된 메모리"는이 영역이 손실되어 프로그램에서 액세스 할 수 없으며 OS에서 해제 할 수 없음을 의미합니다. new 생성되지 않은 짧은

    1 개체에서