2010-01-20 3 views
2

동적으로 연결된 라이브러리에 과부하가 걸린 연산자 delete를 호출하는 데 문제가 있습니다.하지만 new 연산자는 사용하지 않습니다. 내 EXE는 다음과 같이 보입니다 :일관성이없는 연산자 new/삭제 된 호출

class A { 
public: 
    void func() { 
     t = dynLib::Type::CreateObject(); 
    } 
    dynLib::Type t; 
}; 

void main() { 
    A a; 
    a.func(); 
} 

을 그리고 난 내 글로벌 과부하 사업자 문제를 일으키는 동적 링크 라이브러리가 정적으로 링크 된 라이브러리를 가지고있다. 기본적으로 dynLib :: Type 타입은 생성자에 요소를 추가하는 std :: vector를 포함합니다. 그래서 형이 같이 보입니다이

class Type { 
public: 
    Type() { 
     v.push_back(T()); 
    } 

    std::vector<T> v; 
}; 

FUNC()가 호출 될 때, 형의 새로운 인스턴스가 t에 할당 된 다음 값에 의해 전달하고, 생성됩니다. 연산자 = 거기에있는 작업에서 연산자를 통해 std :: vector를 복사합니다. 이것은 이미 생성자에 요소가 추가되었으므로 t의 이전 std :: vector에서 할당 해제를 호출합니다. 이 할당 해제 호출은 내 operator delete 호출로 끝납니다. 문제는 내 연산자 new가 호출되지 않았기 때문에 완전히 다른 메모리 공간에서 포인터를 삭제하는 것입니다 (메모리 로깅에서이를 보여줍니다).

지금, 나는 아마 뭔가를 놓친 것 같습니다. 위의 클래스 A는 dynLib :: Type 객체를 보유하고 있으므로 new 연산자 (정적 라이브러리로부터)가 링크되기 전에 생성 될 수 있습니다. 그게 가능한가? 작성된 dynLib :: Type의 생성자가 어느 지점에서 호출되는지는 확실하지 않습니다. 동적 라이브러리는 기본 stl 할당자를 사용하므로 아무 것도하지 않습니다.

내 exe에 Type 클래스가 있어도 동적으로 링크 된 라이브러리가없는 동일한 상황을 재현 해 보았습니다. 이것은 문제를 일으키지 않지만 링크 순서와 관련이 있어야한다고 생각합니다.

답변

1

이것은 나쁨입니다. DLL 경계에서 STL 개체를 사용하면 효과가 있습니다. 이것은 큰 no-no이며 계속 두통을 일으킬 것입니다. 링크 문제의 가장 큰 원인은 실행 파일과 DLL이 CRT를 사용하는 방법입니다. 정적 (/ MT)을 사용하고 다른 하나는 동적 (/ MD) 인 경우 모든 종류의 이상 함을 볼 수 있으며 과부하 된 연산자 인 new이 일반적으로 결함 일 수 있습니다.

CRT가 전반적으로 일관되면 CRT가 작동해야하지만 정적 라이브러리 인 것처럼 DLL을 사용하지 않는 것이 좋습니다.

DLL 외부에 Type을 생성 할 필요가 없도록 코드를 리팩토링하여보십시오.

+0

라이브러리와 내 exe는 모두 동적 CRT를 사용합니다. 그리고 내가 주로 궁금해하는 점은 왜 내 연산자 삭제 만 사용하고 새 작업이 아닌지입니다. 위의 func()를 호출하면 CreateObject() 함수가 dll에 있고, 새/delete를 사용하지 않아야합니까? –

+0

하지만 실행 파일에있는't'에 할당되기 때문에 실행 파일에있는 연산자'new'를 호출 할 수 있습니다. 이론적으로는 정상적으로 작동해야하지만, 어떤 이유로 그것은 작동하지 않습니다. 이것은 일반적인 문제입니다. http://stackoverflow.com/questions/1085873/dll-memory-manager-mixup –

관련 문제