2009-11-19 2 views
1

함수 foo() dll A..dll 정의에 다음과 같습니다.C++ dll에서 다른 C++ exe로 벡터를 다시 이동하는 문제

vector<CustomObject> foo() 
{ 
     vector<CustomObject> customObjectCollection; 

    //code which populates customObjectCollection goes here 

return customObjectCollection; 
} 

이 메서드 벡터 foo() dll A exe B

전화 할 때 B에서 함수 foo에

"처리되지 않은 예외 xxx18 0x10487b3f (msvcp90d.dll) B.exe에서 처리되지 않은 예외" 0xC0000005 : 위치 0xfdfdfdfd 쓰기 "동안 액세스 위반"처리되지 않은 예외가 발생합니다.

참고 : CustomObject는 복사 생성자를 구현하지 않습니다.

Batch를 A.dll에 연결하여 디버깅을 시도했을 때 foo() 메서드 내에서 벡터가 문제가 있지만 컨트롤이 B.exe로 돌아 가면 벡터의 밸브가 복사되지 않습니다 !!!

또한 foo 메서드가 벡터를 참조로 반환하면 예외가 발생하지 않고 B.exe가 빈 vetor를받습니다 .

문제는 무엇인가 ?? 내가 CustomObject에 대한 복사 생성자를 구현하지 않았기 때문에.

어떤 도움도 대단히 감사합니다. (질문을 올바로 설명하지 않은 것에 대해 사과드립니다.)

감사합니다
jeel

답변

4

이것은 런타임 라이브러리가 일치하지 않는 전형적인 증상입니다. EXE와 DLL이 모두 동적 C++ 라이브러리 (DLL 버전)에 연결되어 있는지 확인해야합니다.

하나 (또는 ​​둘 다)가 정적 C++ 런타임 (LIB 버전)에 연결되어 있으면 다른 주소 공간을 가진 런타임 라이브러리의 인스턴스가 두 개이므로 메모리 위반이 발생합니다.

1

(제대로 질문을 분명히 말하는하지에 대한 사과) 감사 크게한다 벡터를 생성하고 유지하므로 복사 할 필요가 없습니다. 발신자가 정확히 무엇을하고 있는지에 따라, 또한

vector<someclass *> customObjectCollection; 
foo(customObjectCollection); 

할 것, someclass 포인터보다는 someclass 객체의 벡터의 사용을 확인합니다.

2

먼저 스택에 선언 된 로컬 객체에 대한 참조를 반환하면 안됩니다. 둘째 : STL 컨테이너
1) 복사 생성자에 사용되는 요소 수있는 것이 요건이있다
2) 할당 연산자
3) 공중 소멸자
있다 이상의 용기 특정 (연관 컨테이너 선정시 정렬 등) .
할당 연산자 (컴파일러 덕택에)가 명시 적으로 숨기지 않는 한 복사 생성자가 생성됩니다. 개체에 복사 생성자가 없으면 컴파일러에서 불평합니다.
그러나 이러한 암시 적 복사 생성자 및 할당 연산자는 충분히 똑똑하지 않을 수 있으므로 직접 구현해야 할 수 있습니다. 예를 들어, 생성자의 CustomObject가 new으로 일부 클래스의 인스턴스를 만들고 소멸자에서 소멸시킬 포인터로 유지한다고 가정 해 보겠습니다. 기본 복사 생성자는 얕은 복사를 만들므로 두 포인터가 같은 객체를 유지하게됩니다. 그 중 하나가 파괴되면, 두 번째 포인터는 일관성을 잃게됩니다 (이미 놓인 포인터를가집니다).

최종 메모 : 값으로 벡터를 반환하지 마십시오. 많은 복사 작업이 필요합니다. 스택의 호출자에서 선언하고 foo 참조로 전달하십시오.

+0

답변 : :) A.dll에서 foo() 함수를 사용하고 있는데 제대로 작동하지만 다른 dll이나 exe에서 사용하려고 할 때 실패합니다! – JeeZ

+0

그렇다면 (다른 사람들이 이미 답한 것처럼) 링크와 관련이있을 수 있습니다. – BostonLogan

1

여기에는 여러 가지 가능성이 있으며 적용 가능성이 가장 높은 것을 결정할만큼 충분히 말씀하지 않았습니다.

하나의 가능성은 (세미 -) DLL에 코드를 넣는 것에 고유합니다. 표준 라이브러리를 정적으로 링크하면 각 모듈 (EXE, DLL)은 자체 힙을 포함하여 고유 한 메모리 관리 기능을 갖기 때문에 한 모듈과 다른 모듈간에 메모리 소유권을 이전하려고하는 작업이 (이상하게) 원인. 이러한 유형의 문제에 대한 해결책은 일반적으로 모든 모듈에 대한 DLL의 표준 라이브러리에 연결하는 것입니다. 이렇게하면 표준 라이브러리 복사본이 응용 프로그램에서 공유되므로 모듈간에 소유권을 넘겨도 문제가 발생하지 않습니다.

CustomObject 클래스가 적절하게 복사를 처리하지 못하는 또 다른 가능성이 있습니다. 내부에 대해 아무 것도 말하지 않았으므로 여기에서해야 할 일이 무엇인지 짐작할 수 없습니다.

+0

안녕하세요 제리, 감사합니다 ... CustomObject 클래스는 다음과 같습니다. class CustomObject { string name; 문자열 경로; 벡터 기능; // getter setter methods // 클래스에 명시 적으로 정의 된 생성자 또는 소멸자가 없습니다. } – JeeZ

+0

이 경우에 가장 먼저 시도해야 할 것은 DLL 기반 표준 라이브러리와 연결하는 것입니다. –

관련 문제