문제

내가 사용하는 경우 new 내 라이브러리의 키워드(내 기본 앱과 다르게 구축됨)를 사용하여 기본 앱에서 삭제하면 delete, 충돌/오류가 발생할 가능성이 있나요?

도움이 되었습니까?

해결책

예, 참으로. 특히 라이브러리가 새 배치를 사용하거나 사용자 지정 힙을 사용하는 경우 디버그/릴리스 힙에 문제가있는 문제가 있습니다. 디버그/릴리스 문제는 가장 일반적입니다.

다른 팁

때에 따라 다르지. 정적 라이브러리에 대해 이야기하고 있다면 아마도 괜찮을 것입니다. 코드는 동일한 C ++ 런타임 라이브러리를 사용하여 기본 프로그램과 동일한 맥락에서 실행됩니다. 이것은 그것을 의미합니다 new 그리고 delete 동일한 힙을 사용합니다.

공유 라이브러리 (DLL)에 대해 이야기하고 있다면 아마도 괜찮지 않을 것입니다. DLL에서 실행되는 코드는 다른 C ++ 런타임 라이브러리를 사용하는 것일 수 있으므로 힙의 레이아웃이 다릅니다. DLL은 완전히 다른 힙을 사용하고있을 수 있습니다.

부름 delete (메인 프로그램에서) DLL (또는 그 반대)에 의해 할당 된 포인터의 (기껏해야) 즉각적인 충돌 또는 (최악의) 메모리 손상으로 이어지는 (최악의 경우) 추적하는 데 시간이 걸릴 수 있습니다.

몇 가지 옵션이 있습니다. 첫 번째는 "Factory Method"패턴을 사용하여 이러한 객체를 작성하고 삭제하는 것입니다.

Foo *CreateFoo();
void DeleteFoo(Foo *p);

이것들은해야합니다 ~ 아니다 헤더 파일에서 구현됩니다.

또는 a를 정의 할 수 있습니다 Destroy 객체의 메소드 :

class Foo
{
    ~Foo();

public:
    virtual void Destroy();
};

... 다시, 헤더 파일에서 이것을 구현하지 마십시오. 당신은 그것을 구현할 것입니다 :

void Foo::Destroy()
{
    delete this;
    // don't do anything that accesses this object past this point.
}

Foo의 소멸자는 개인이므로 전화해야합니다. Foo::Destroy.

Microsoft Com은 비슷한 일을합니다. Release 기준 수가 0으로 떨어질 때 객체를 삭제하는 메소드.

예, 당신은 할 것입니다. 간단한 솔루션은 기본 애플리케이션에서 호출 할 수있는 라이브러리에서 만들기 및 삭제 기능을 제공하는 것입니다. Create Function은 새 새를 수행하고 포인터를 반환합니다.이 포인터는 나중에 삭제를 위해 삭제 함수로 전달됩니다.

Windows에서만 보던 문제입니다.

Unixish 시스템은 공유 라이브러리를 동일한 프로그램 내에서 동일한 라이브러리의 다른 버전에 강제로 연결하는 습관을 만들지 않으며 로드된 모든 기호는 전역적으로 표시됩니다.이는 객체가 코드의 한 부분에서 할당되고 다른 부분에서 삭제되면 둘 다 동일한 시스템 라이브러리를 사용하여 이를 수행한다는 것을 의미합니다.

Windows가 다양한 C 런타임 DLL로 생성하는 이 문제는 C 프로그래머에게 정말 짜증나고 부자연스러운 문제입니다.C 라이브러리를 살펴보세요.여기에는 문자열을 malloc하고 프로그래머가 이에 대해 free()를 호출할 것으로 예상하는 strdup와 같은 함수가 있습니다.그러나 Windows의 자체 라이브러리에서 동일한 작업을 수행하고 폭발을 기다리십시오.개발 중에는 발생하지 않고 컴파일된 DLL을 다른 잘못된 SAP에 제공한 후에만 발생하기 때문에 기다려야 합니다.

오래된 새로운 것 전에 이것을 다루었습니다. 또한 Microsoft의 주요 솔루션 목록을 제공합니다.

당신은 거기에 문제가 있다는 것이 옳지 만, 대부분의 경우 다른 답변보다 훨씬 간단한 솔루션이 있습니다 (지금까지). 새로 사용하고 자유롭게 삭제할 수 있습니다. DLL 경계에서 사용될 수있는 라이브러리의 각 클래스에 대해 새로로드하고 삭제해야합니다.

개인적으로, 나는 필요한 기능을 제공하기 위해 간단한 클래스를 정의했습니다.

class NewDelete
{
    public:
        void *operator new (size_t size);
        void operator delete (void *memory);
        void *operator new (size_t size, void *ptr);
        void operator delete (void *memory, void *ptr);
};

이 네 가지 멤버 함수가 모두 동일한 DLL에 정의 된 한,이 클래스에서 파생되는 클래스는 자동으로 "DLL-SAFE"입니다. 새 및 삭제는 DLL 경계에 대해 걱정하지 않고 정상적으로 사용할 수 있습니다.

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