문제

도 사람들은 불평하는 C++없습니다.또한 듣는 C++표준 위원회는 보고서에 추가 언어입니다.난 두려워하지 않는 점을 보다...사용 RAII 스마트 포인터 필요성을 제거한 그것을 위해,오른쪽?

내 경험을 가진 쓰레기 수집에서 부부의 저렴한 십는 가정용 컴퓨터,그것이 의미하는 시스템 동결을 위해 몇 초마다 그래서 많습니다.난 그것은 그 이후 개선,하지만 당신이 기대할 수 있습니다 추측,남겨두지 않는 나와 함께 고의 의견니다.

어떤 장점이 수있는 가비지 컬렉션을 제안 경험있는 C++개발자입니까?

도움이 되었습니까?

해결책

C ++에 쓰레기 수집이 없다고 불평하는 사람들이 계속 들었습니다.

나는 그들에게 너무 미안하다. 진지하게.

C ++는 Raii를 가지고 있으며, 나는 항상 수집 된 언어로 쓰레기로 Raii (또는 거세 된 raii)를 찾지 않는다고 불평합니다.

쓰레기 수집이 경험이 풍부한 C ++ 개발자에게 어떤 장점이 있습니까?

또 다른 도구.

Matt J는 그의 게시물에서 꽤 썼습니다 (C ++의 쓰레기 수집 - 왜?) : C ++ 기능이 필요하지 않아 대부분 C로 코딩 될 수 있으므로 C ++ 기능이 필요하지 않으며 대부분의 조립품 등에 코딩 할 수 있으므로 C 기능이 필요하지 않습니다. C ++는 진화해야합니다.

개발자로서 : 나는 GC에 신경 쓰지 않는다. 나는 Raii와 GC를 모두 시도했고 Raii가 훨씬 우수하다고 생각합니다. Greg Rogers가 그의 게시물에서 말했듯이 (C ++의 쓰레기 수집 - 왜?), 메모리 누출은 RAII 대신 GC를 정당화하기 위해 C ++에서는 C ++에서는 드물다). GC는 결정 론적 거래/최종화를 가지고 있으며 특정 메모리 선택에 관심이없는 코드 작성.

이 마지막 문장은 중요합니다. "Juste가 신경 쓰지 않는"코드를 작성하는 것이 중요합니다. C ++ RAII에서도 같은 방식으로 우리는 Resource Freeing에 대해 신경 쓰지 않습니다. Raii가 우리를 위해 그것을하기 때문에, 또는 객체 초기화를 위해 생성자가 우리를 위해 그것을 수행하기 때문에, 때로는 메모리의 소유자인지 신경 쓰지 않고 코드 만 코드하는 것이 중요합니다. 그리고이 코드 또는이 코드에 필요한 친절한 포인터 (공유, 약함 등). C ++에서 GC가 필요하다고 생각합니다. (내가 개인적으로 보지 못하더라도)

C ++에서 좋은 GC 사용의 예

때로는 앱에는 "부동 데이터"가 있습니다. 트리와 같은 데이터 구조를 상상해보십시오. 그러나 아무도 데이터의 "소유자"가 아닙니다 (그리고 정확히 파괴 될시기에 대해 아무도 신경 쓰지 않습니다). 여러 객체가 사용할 수 있습니다. 그런 다음 버릴 수 있습니다. 아무도 더 이상 사용하지 않을 때 해방되기를 원합니다.

C ++ 접근 방식은 스마트 포인터를 사용하고 있습니다. 부스트 :: shared_ptr가 떠 오릅니다. 따라서 각 데이터는 자체 공유 포인터가 소유합니다. 시원한. 문제는 각 데이터가 다른 데이터 조각을 참조 할 수 있다는 것입니다. 공유 포인터는 참조 카운터를 사용하기 때문에 사용할 수 없습니다.이 카운터는 원형 참조를 지원하지 않습니다 (A는 B에 대한 포인트, B 포인트 A). 따라서 약한 포인터 (boost :: excer_ptr)를 어디에서 사용 해야하는지, 그리고 공유 포인터를 사용할시기에 대해 많이 생각해야합니다.

GC를 사용하면 트리 구조 데이터 만 사용합니다.

단점은 당신이 신경 쓰지 말아야한다는 것입니다 언제 "플로팅 데이터"는 실제로 파괴됩니다. 그것만이 될거야 파괴됨.

결론

결국, 올바르게 수행되고 현재 C ++의 관용구와 호환되면 GC는 C ++를위한 또 다른 좋은 도구.

C ++는 멀티 파라 디그 언어입니다. GC를 추가하면 C ++ 팬보이가 반역 때문에 울부 짖을 것입니다. 그러나 결국에는 좋은 생각이 될 수 있으며 C ++ 표준 COMITEE는 이런 종류의 주요 기능이 언어, 그래서 우리는 C ++를 방해하지 않는 올바른 C ++ GC를 가능하게하는 데 필요한 작업을하도록 신뢰할 수 있습니다. 항상 C ++에서와 같이, 기능이 필요하지 않은 경우 사용하지 않으면 비용이 들지 않습니다.

다른 팁

짧은 대답은 쓰레기 수집이 원칙적으로 Smart Pointers와 함께 Raii와 매우 유사하다는 것입니다. 당신이 할당 한 모든 메모리가 물체 안에 있고 그 물체가 스마트 포인터에 의해서만 언급된다면, 당신은 가비지 컬렉션에 가까운 것이 있습니다 (잠재적으로 더 나은). 장점은 모든 객체를 범위화하고 스마트 포인터링하는 것에 대해 신중하지 않아야하며, 런타임이 당신을 위해 작동하게합니다.

이 질문은 "C ++가 경험이 풍부한 어셈블리 개발자에게 무엇을 제공해야합니까? 지침과 서브 루틴은이를 필요로하지 않습니까?"

Valgrind와 같은 좋은 메모리 검사기의 출현으로, "우리는 무언가를 처리하는 것을 잊어 버린 경우"안전망으로 쓰레기 수집을 많이 사용하는 데 많이 사용되지 않습니다. 기억 외에는 (이들은 훨씬 덜 일반적이지만). 게다가, 컨테이너는 일반적으로 훨씬 간단하고 더 나은 방법이기 때문에 내가 본 코드에서는 (스마트 포인터조차도) 명시 적으로 할당 및 거래를 할당하는 것이 매우 드 rare니다.

그러나 쓰레기 수집은 특히 짧은 수명이 많은 물체가 힙을 할당하는 경우 잠재적으로 성능 혜택을 제공 할 수 있습니다. GC는 또한 새로 생성 된 객체 (스택의 개체와 비교할 수 있음)에 대한 더 나은 참조 지역을 제공 할 수 있습니다.

C ++에서 GC 지원에 대한 동기 부여 요인은 Lambda 프로그래밍, 익명 기능 등으로 보입니다. Lambda 라이브러리는 정리에 관심을 갖지 않고 메모리를 할당 할 수있는 능력으로부터 이익이된다는 것이 밝혀졌습니다. 평범한 개발자의 이점은 더 단순하고 신뢰할 수 있고 빠른 Lambda 라이브러리를 컴파일하는 것입니다.

GC는 또한 무한 메모리를 시뮬레이션하는 데 도움이됩니다. 포드를 삭제 해야하는 유일한 이유는 메모리를 재활용해야하기 때문입니다. GC 또는 무한 메모리가있는 경우 더 이상 포드를 삭제할 필요가 없습니다.

위원회는 쓰레기 수집을 추가하지 않으며 쓰레기 수집을보다 안전하게 구현할 수있는 몇 가지 기능을 추가하고 있습니다. 시간만이 미래의 컴파일러에 실제로 어떤 영향을 미치는지 알 수 있습니다. 특정 구현은 광범위하게 다를 수 있지만, 도달 가능성 기반 컬렉션이 포함될 수 있으며, 이는 수행 방식에 따라 약간의 교수형이 포함될 수 있습니다.

그러나 한 가지는 표준 정보 가비지 수집기가 소멸자를 부를 수 없다는 것입니다.

쓰레기 수집이 경험이 풍부한 C ++ 개발자에게 어떤 장점이 있습니까?

덜 경험이없는 동료 코드에서 자원 누출을 추격 할 필요가 없습니다.

난 이해하지 못하는 어떻게 변론할 수 있는 RAII 대체 GC,혹은 훨씬 우수합니다.많은 경우가 있습니다 처리하여 gc 는 RAII 단순히 다룰 수 없다.그들은 다른 짐승입니다.

첫째,RAII 되지 않은 총알 증거:그것은 작품 중 일부에 대해 일반적인 실패하는 보급에서는 C++,하지만 많은 경우 RAII 도움이되지 않는 모그것은 깨지기 쉬운 비동기 이벤트(신호는 유닉스에서).기본적으로,RAII 에 의존하는 범위 지정:변수가 범위를 벗어나,그것은 자동으로 해제됩(고 가정하고 소멸자가 제대로 구현의 과정).

여기에 간단한 예제는 어느 auto_ptr 또는 RAII 당신을 도울 수 있습니다:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <memory>

using namespace std;

volatile sig_atomic_t got_sigint = 0;

class A {
        public:
                A() { printf("ctor\n"); };
                ~A() { printf("dtor\n"); };
};

void catch_sigint (int sig)
{
        got_sigint = 1;
}

/* Emulate expensive computation */
void do_something()
{
        sleep(3);
}

void handle_sigint()
{
        printf("Caught SIGINT\n");
        exit(EXIT_FAILURE);
}

int main (void)
{
        A a;
        auto_ptr<A> aa(new A);

        signal(SIGINT, catch_sigint);

        while (1) {
                if (got_sigint == 0) {
                        do_something();
                } else {
                        handle_sigint();
                        return -1;
                }
        }
}

의 소멸자는 것입니다출 되지 않습니다.물론 그것은 인공과 고안 다소 예를 들어,하지만 비슷한 상황에도 실제로 발생할 수 있습;예를 들어 때는 코드를 호출하여 다른 코드를 처리하는 SIGINT 및 제어할 수 없는 이상 모두에서(구체적인 예를 들어:mex 확장 matlab).그것은 동일한 이유 마침내에서는 파이썬은 보장하지 않 실행의 무언가이다.Gc 에서 당신을 도울 수 있습니다.

기타 숙어 재생되지 않으로 잘 이:어떤 아닌 사소한 프로그램이 필요한 상태 저장체(나는 단어를 사용하여 객체에는 매우 광범위한 감각 여기에,그것은이 될 수 있습 건설에 의해 허용되는 언어);필요하신 경우에는 제어 상태를 외부의 함수할 수 없습니다 그렇게 쉽게 RAII(는 이유는 RAII 지 않는 도움이 된 비동기 프로그래밍).새로운 gc 의 전체적인 메모리의 프로세스,그것은 그것에 대해 알고 있는 모든 물체를 할당한,그리고 청소할 수 있는 비동기적으로 수행됩니다.

수도 있습이 훨씬 더 빠르게 사용하는 gc,같은 이유:을 할당해야 하는 경우/deallocate 많은 개체를(특히 작은 물건),gc 를 훨씬 능가 RAII 지 않는 한 당신이 쓰는 사용자 정의 할당자 이후 gc 할당할 수 있/깨끗하는 많은 개체 중 하나에서 전달합니다.몇 가지 잘 알려진 C++프로젝트를 사용하여 gc,심지어는 성과물(예를 들어 볼 팀 Sweenie 의 사용에 대해 gc 에 Unreal Tournament: http://lambda-the-ultimate.org/node/1277).GC 기본적으로 처리량이 증가 비용의 대기 시간이 길어집니다.

물론,는 경우가 있 RAII 보다 더 gc;특히,gc 개념은 주로 염려하는 메모리,그리고 그만 ressource.일일,etc....잘 할 수 있으로 처리 RAII.언어 기억의 유무에 관계없이 처리한 파일이 들거나 루비오 다음과 같이 RAII 한 경우,BTW(을 가진 문서는 python).RAII 은 매우 유용할 때 정확하게 필요하 제어할 때 ressource 은 해방과는 아주 종종 파일의 경우 또는 잠금에 대한 예입니다.

C ++가 가비지 컬렉션이 없기 때문에 가정하는 것은 전통적인 오류입니다. 언어로 구워, C ++ 기간에는 쓰레기 수집을 사용할 수 없습니다. 이것은 말도 안됩니다. 나는 물론 Boehm Collector를 사용하는 엘리트 C ++ 프로그래머를 물론 그들의 작업에서 사용합니다.

쓰레기 수집이 허용됩니다 연기하다 누구에 대한 결정 소유합니다 객체.

C ++는 값 의미를 사용하므로 RAII를 사용하면 범위를 벗어날 때 물체가 수집됩니다. 이것은 때때로 "즉시 GC"라고도합니다.

프로그램이 참조-내성 (스마트 포인터 등을 통해)을 사용하기 시작하면 언어가 더 이상 당신을 지원하지 않으면 스마트 포인터 라이브러리의 재치에 맡겨집니다.

GC에 대한 까다로운 것은 결정입니다 언제 더 이상 물체가 필요하지 않습니다.

쓰레기 수집이 만듭니다 RCU 잠금식 동기화가 정확하고 효율적으로 구현하기가 훨씬 쉽습니다.

더 쉬운 스레드 안전성 및 확장 성

일부 시나리오에서는 매우 중요한 GC 속성이 있습니다. 포인터 할당은 대부분의 플랫폼에서 자연스럽게 원자력이며, 스레드 안전 참조 카운트 ( "스마트") 포인터는 상당히 어렵고 상당한 동기화 오버 헤드를 소개합니다. 결과적으로, 스마트 포인터는 종종 멀티 코어 아키텍처에서 "확장되지 않아야한다"고 말합니다.

쓰레기 수집은 실제로 자동 자원 관리의 기초입니다. GC를 사용하면 정량화하기 어려운 방식으로 문제를 해결하는 방식이 바뀝니다. 예를 들어 수동 리소스 관리를 할 때는 다음과 같습니다.

  • 항목을 해제 할 수있는시기를 고려하십시오 (모든 모듈/클래스가 완료 되었습니까?)
  • 누가 자원이 해방 될 준비가되었을 때 자원을 해방시키는 것이 책임이 누구인지 고려하십시오 (어떤 클래스/모듈 이이 항목을 해제해야합니까?)

사소한 경우에는 복잡성이 없습니다. 예를 들어 메소드 시작시 파일을 열고 끝에 닫습니다. 또는 발신자는이 반환 된 메모리 블록을 자유롭게해야합니다.

자원과 상호 작용하는 여러 모듈이있을 때 상황이 신속하게 복잡해지기 시작하며 누가 정리 해야하는지 명확하지 않습니다. 최종 결과는 문제를 해결하기위한 전체 접근 방식에는 타협 인 특정 프로그래밍 및 설계 패턴이 포함된다는 것입니다.

쓰레기 수집이있는 언어로 일회용의 당신이 끝내는 자원을 자유롭게 할 수있는 패턴이지만, 당신이 그들을 해방시키지 못하면 GC는 하루를 절약 할 수 있습니다.


실제로 내가 언급 한 타협의 완벽한 예인 똑똑한 포인터. 스마트 포인터는 백업 메커니즘이 없으면 순환 데이터 구조를 누출하지 못하게 할 수 없습니다. 이 문제를 피하기 위해 종종 타협하고 주기적 구조를 사용하지 않더라도 가장 잘 맞을 수도 있습니다.

나도 C ++ Commitee가 표준에 본격적인 쓰레기 수집을 추가하고 있다는 의문을 가지고 있습니다.

하지만 현대 언어로 쓰레기 수집을 추가/갖는 주된 이유는 좋은 이유가 너무 적기 때문입니다. 에 맞서 쓰레기 수집. 80 년대 이래로 메모리 관리 및 쓰레기 수집 분야에서 몇 가지 큰 발전이 있었으며 소프트 타임과 같은 보증을 줄 수있는 쓰레기 수집 전략도 있다고 생각합니다 (GC는 .. .. 최악의 경우 ").

Smart Pointers와 함께 Raii를 사용하면 필요하지 않습니까?

스마트 포인터는 쓰레기 수집 (자동 메모리 관리)의 형태 인 C ++에서 기준 계수를 구현하는 데 사용될 수 있지만 생산 GC는 더 이상 중요한 결함이 있기 때문에 더 이상 참조 계산을 사용하지 않습니다.

  1. 기준 계산 누출 사이클. asB를 고려하고, 두 객체 A와 B는 서로를 참조하여 둘 다 참조 수를 가지며 수집되지 않지만 둘 다 되 찾아야합니다. 고급 알고리즘과 같은 시험 삭제 이 문제를 해결하지만 많은 복잡성을 추가하십시오. 사용 weak_ptr 해결 방법이 수동 메모리 관리로 다시 떨어지고 있습니다.

  2. 순진한 기준 계수는 몇 가지 이유로 느립니다. 첫째, 캐시 외 참조 계수가 자주 부딪 치려면 Boost 's Shared_ptr Ocaml의 쓰레기 수집보다 최대 10x 느려). 둘째, 범위가 끝날 때 주사 된 소멸자는 불필요하고 예측 된 가상 함수 호출을 발생시키고 꼬리 통화 제거와 같은 최적화를 억제 할 수 있습니다.

  3. 스코프 기반 참조 계산은 스코프가 끝날 때까지 물체가 재활용되지 않기 때문에 부유 식 쓰레기를 유지하는 반면, 추적 GC는 도달 할 수없는 즉시 추적 할 수 있습니다.

쓰레기 수집이 경험이 풍부한 C ++ 개발자에게 어떤 장점이 있습니까?

생산성과 신뢰성이 주요 이점입니다. 많은 응용 프로그램의 경우 수동 메모리 관리에는 상당한 프로그래머 노력이 필요합니다. 무한 메모리 기계를 시뮬레이션함으로써 가비지 컬렉션은 프로그래머를이 부담에서 해방시켜 문제 해결에 집중할 수있게하고 몇 가지 중요한 버그 등급 (매달려 포인터, 누락 free, 이중 free). 또한 쓰레기 수집은 다른 형태의 프로그래밍을 촉진합니다. 위쪽으로 Funarg 문제 (1970).

GC를 지원하는 프레임 워크에서 문자열과 같은 불변의 객체에 대한 참조는 원시와 같은 방식으로 전달 될 수 있습니다. 클래스 (C# 또는 Java)를 고려하십시오.

public class MaximumItemFinder
{
  String maxItemName = "";
  int maxItemValue = -2147483647 - 1;

  public void AddAnother(int itemValue, String itemName)
  {
    if (itemValue >= maxItemValue)
    {
      maxItemValue = itemValue;
      maxItemName = itemName;
    }
  }
  public String getMaxItemName() { return maxItemName; }
  public int getMaxItemValue() { return maxItemValue; }
}

이 코드는 내용물 현 중 하나이며 단순히 프리미티브로 취급 할 수 있습니다. 같은 진술 maxItemName = itemName; 등록 부하와 레지스터 스토어가 이어지는 두 가지 지침을 생성 할 것입니다. 그만큼 MaximumItemFinder 발신자가 있는지 알 수있는 방법이 없을 것입니다 AddAnother 통과 된 문자열에 대한 언급을 유지하고 발신자는 얼마나 오래 걸리는지 알 수 없습니다. MaximumItemFinder 그것들에 대한 참조를 유지합니다. 발신자 getMaxItemName 언제 그리고 언제인지 알 수있는 방법이 없습니다 MaximumItemFinder 그리고 반환 된 문자열의 원래 공급 업체는 이에 대한 모든 참조를 포기했습니다. 그러나 코드는 단순히 원시 값과 같은 문자열 참조를 전달할 수 있기 때문에 그 중 어느 것도 중요하지 않습니다.

또한 위의 클래스는 동시 호출이있을 때 스레드 안전하지는 않지만 AddAnother, 모든 전화 GetMaxItemName 빈 문자열 또는 전달 된 문자열 중 하나에 대한 유효한 참조를 반환하도록 보장됩니다. AddAnother. 최대 항목 이름과 그 값 사이의 관계를 보장하려면 스레드 동기화가 필요하지만 메모리 안전은 부재하더라도 보장됩니다.

C ++에서 위와 같은 방법을 쓸 수있는 방법은 없다고 생각하지 않으며, 이는 스레드 동기화를 사용하지 않고 임의의 멀티 스레드 사용이 있으면 메모리 안전을 유지하거나 모든 문자열 변수가 자체 자체 내용을 가지고 있어야합니다. , 자체 저장 공간에 보관되어 문제의 변수의 수명 동안 출시되거나 재배치 될 수 있습니다. 정의, 할당 및 주변을 int.

쓰레기 수집은 최악의 악몽을 누출 할 수 있습니다

순환 참조와 같은 것을 처리하는 본격적인 GC는 Ref-Counted보다 다소 업그레이드됩니다. shared_ptr. 나는 C ++에서 그것을 어느 정도 환영하지만 언어 수준은 아닙니다.

C ++에 대한 미녀 중 하나는 쓰레기 수집을 강요하지 않는다는 것입니다.

나는 일반적인 오해를 바로 잡고 싶다 : 쓰레기 수집 신화 어떻게 든 누출을 제거합니다. 내 경험상, 다른 사람들이 작성한 디버깅 코드의 최악의 악몽과 가장 비싼 논리적 누출을 발견하려고 시도하는 것은 리소스 집약적 인 호스트 애플리케이션을 통해 내장 된 파이썬과 같은 언어가 포함 된 쓰레기 수집과 관련이 있습니다.

GC와 같은 주제에 대해 이야기 할 때 이론이 있으며 연습이 있습니다. 이론적으로는 훌륭하고 누출을 방지합니다. 그러나 이론적 수준에서는 이론적으로 모든 언어가 훌륭하고 누출이 없어도 이론적으로는 모든 사람이 완벽하게 올바른 코드를 작성하고 단일 코드가 잘못 될 수있는 모든 가능한 사례를 테스트 할 것입니다.

비밀 팀의 협력과 결합 된 쓰레기 수집은 우리의 경우 최악의 가장 어려운 유출을 일으켰습니다.

문제는 여전히 자원의 소유권과 관련이 있습니다. 지속적인 물체가 관련 될 때 명확한 디자인 결정을 내려야하며 쓰레기 수집은 당신이하지 않는다고 생각하기가 너무 쉽습니다.

자원이 주어지면 R, 개발자가 끊임없이 서로의 코드를 끊임없이 전달하고 검토하지 않는 팀 환경에서 (내 경험에서 너무 일반적인 것) 개발자에게는 매우 쉬워집니다. A 해당 리소스에 손잡이를 저장합니다. 개발자 B 아마도 간접적으로 추가하는 모호한 방식으로 R 일부 데이터 구조에. 또한 C. 쓰레기 수집 시스템에서 이것은 3 명의 소유자를 만들었습니다. R.

개발자 때문에 A 원래 자원을 만든 사람이었고 자신이 그 소유자라고 생각하는 사람이었고, 그는 R 사용자가 더 이상 사용하고 싶지 않다는 것을 나타내는 경우. 결국, 그가 그렇게하지 않으면 아무 일도 일어나지 않을 것이며 사용자 엔드 제거 로직이 아무것도하지 않았다는 것이 명백 할 것입니다. 그래서 그는 합리적으로 유능한 개발자와 마찬가지로 그것을 공개 한 것을 기억합니다. 이것은 이벤트를 유발합니다 B 그것을 처리하고 또한 R.

하지만, C 잊어 버려. 그는 팀의 강력한 개발자 중 하나가 아닙니다. 1 년 동안 시스템에서 일한 다소 신선한 신입 사원. 또는 팀에도 있지 않을 수도 있고, 많은 사용자가 소프트웨어에 추가하는 제품에 대한 인기있는 타사 개발자 일뿐입니다. 쓰레기 수집을 통해 이것은 우리가 조용한 논리적 자원 누출을 얻을 때입니다. 그것들은 최악의 종류입니다. 그들은 프로그램을 실행하는 동안의 기간이 지나도 메모리 사용이 신비한 목적을 위해 계속 상승하고 상승한다는 사실 외에도 소프트웨어의 사용자가 가시 가능한 측면에서 반드시 나타나지는 않습니다. 디버거로 이러한 문제를 좁히려는 것은 시간에 민감한 레이스 조건을 디버깅하는 것만 큼 재미있을 수 있습니다.

쓰레기 수거없이 개발자 C a 매달려 포인터. 그는 어느 시점에서 액세스하려고 시도하고 소프트웨어가 충돌하게 만들 수 있습니다. 이제 테스트/사용자가 가시 가능한 버그입니다. C 약간 당황하고 그의 버그를 수정합니다. GC 시나리오에서는 시스템이 누출되는 위치를 파악하려고 노력하는 것이 너무 어려울 정도로 일부 누출이 수정되지 않습니다. 이것들은 아닙니다 valgrind-쉽게 감지하고 특정 코드 라인에 정확히 찾아 낼 수있는 물리적 누출.

쓰레기 수집, 개발자 C 매우 신비로운 누출을 만들었습니다. 그의 코드는 계속해서 액세스 할 수 있습니다 R 이 시점에서 사용자와 관련이 없지만 여전히 유효한 상태에있는 소프트웨어에서 보이지 않는 엔티티 일뿐입니다. 그리고 AS C의 코드는 더 많은 누출을 생성하고, 관련없는 리소스에 대해 더 숨겨진 처리를 생성하고 있으며, 소프트웨어는 메모리 유출뿐만 아니라 매번 느리게 느려지고 있습니다.

따라서 쓰레기 수집이 논리적 자원 누출을 반드시 완화 할 필요는 없습니다. 이상적인 시나리오보다 적은 시나리오에서 누출을 조용히 눈에 띄지 않고 소프트웨어를 유지하기가 훨씬 쉽게 만들 수 있습니다. 개발자는 GC 논리 누출을 추적하려고 노력하여 사용자에게 단순히 소프트웨어를 주기적으로 해결 방법으로 다시 시작하도록 지시하려고 노력할 수 있습니다. 그것은 매달려 포인터를 제거하고 어떤 시나리오에서도 충돌이 완전히 용납 할 수없는 안전에 집착 한 소프트웨어에서는 GC를 선호합니다. 그러나 나는 종종 안전하지 않지만 자원 집약적 인 성능 크리티컬 제품에서 일하고 있으며, 신속하게 고정 될 수있는 충돌이 실제로 모호하고 신비한 조용한 버그보다 바람직하며, 자원 누출은 사소한 버그가 아닙니다.

이 두 경우 모두, 우리는 3D 소프트웨어의 장면 그래프 또는 컴포지 업체 또는 게임 세계의 적에서 사용할 수있는 비디오 클립과 같이 스택에 상주하지 않는 지속적인 객체에 대해 이야기하고 있습니다. 자원이 수명을 묶을 때 C ++와 다른 GC 언어는 자원을 올바르게 관리하는 것이 사소한 경향이 있습니다. 진정한 어려움은 다른 자원을 참조하는 지속적인 자원에 있습니다.

C 또는 C ++에서는 자원을 소유 한 사람을 명확하게 지정하지 못하고 손잡이가 해제되어야하는 경우 (예 : 이벤트에 대한 응답으로 NULL로 설정) 그러나 GC에서는 크고 불쾌하지만 종종 스포트하기 쉬운 충돌은 결코 감지되지 않을 수있는 조용한 자원 누출로 교환됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top