2013-05-10 2 views
2

내가 비주얼 C++ 프로젝트를 사용하고혼합 유형

#pragma once 
using namespace UsbLibrary; 

ref class MissileLauncher 
{ 
public: 
    MissileLauncher(void); 

private: 
    //Bytes used in command 
    unsigned char UP[10]; 
    unsigned char RIGHT[10]; 
    unsigned char LEFT[10]; 
    unsigned char DOWN[10]; 

    unsigned char FIRE[10]; 
    unsigned char STOP[10]; 
    unsigned char LED_OFF[9]; 
    unsigned char LED_ON[9]; 

    UsbHidPort USB; 
}; 

다음 헤더 파일에서 참조하시기 바랍니다 지원되지 않습니다 (C++/CLI?) 비주얼 스튜디오 전문 2010 년에이 코드를 실행하면 I 오류의 많은

다음
Error 1 error C4368: cannot define 'UP' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 2 error C4368: cannot define 'RIGHT' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 3 error C4368: cannot define 'LEFT' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 4 error C4368: cannot define 'DOWN' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 5 error C4368: cannot define 'FIRE' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 6 error C4368: cannot define 'STOP' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 7 error C4368: cannot define 'LED_OFF' as a member of managed 'MissileLauncher': mixed types are not supported  
Error 8 error C4368: cannot define 'LED_ON' as a member of managed 'MissileLauncher': mixed types are not supported 

이 네임 스페이스 USBLibrary는 C#을 DLL 파일에서 오는을 얻을. UsbHidPort;은 C# dll의 객체입니다

그래서이 오류가 발생하는 이유는 무엇입니까? 어떤 아이디어?

+0

(http://blogs.msdn.com/b/branbray/archive/2005를 /07/20/441099.aspx)는 네이티브 형식, 관리되는 형식 및 시간/방법/방법을 설명합니다. 약간 날짜이지만, 그 핵심은 당신에게 가지고있는 문제, 왜 그것을 가지고 있는지, 그리고 그것에 대해 할 수있는 일을 보여줄 것입니다. – WhozCraig

답변

6

적어도이 보이는 경우에는이 문제가 실제로 발생하지 않지만 C++/CLI 컴파일러는 발사 미사일 스타일을 피하려고합니다. 가비지 콜렉터는 힙을 압축 할 때 오브젝트를 이동합니다. 네이티브 객체를 매우 위험하게 만들면, 그 객체에 대한 포인터가 유효하지 않게되고, 쓸 때 GC 힙이 파괴됩니다. 수집기는 해당 포인터를 업데이트 할 수 없으므로 해당 포인터를 찾을 수 없습니다. 위험은 너무 높아서 컴파일러는 단지 그것을 금지합니다.

대신 이러한 멤버를 포인터로 선언하고 연산자 new를 사용하여 클래스 생성자에 배열을 할당하는 방법이 있습니다.

private: 
    unsigned char* UP; 
    // etc.. 
public: 
    MissileLauncher() { 
     UP = new unsigned char[10]; 
     // etc.. 
    } 
    ~MissileLauncher() { 
     this->!MissileLauncher(); 
     UP = nullptr; // Destructor may be called more than once 
    } 
    !MissileLauncher() { 
     delete[] UP; 
     // etc... 
    } 

이러한 배열의 메모리를 해제하기위한 소멸자 및 종료 자에 대한 요구 사항에 유의하십시오. 소멸자를 정의하는 것은 클라이언트 프로그래머가 Dispose() 또는 C# 클라이언트 프로그램에서 사용 (C++/CLI 프로그램에서 의미를 삭제하거나 스택에 저장)하는 부담을 가져오고, 그러한 작은 할당을 건너 뛰는 것은 무리가 아닙니다 . 그리고 마지막으로, 온건 솔루션을 고려하고 관리 배열 사용 : 내가 [이 문서] 읽기를 제안

private: 
    array<Byte>^ UP; 
    // etc.. 
public: 
    MissileLauncher() { 
     UP = gcnew array<Byte>(10); 
     // etc.. 
    } 
+0

굉장! 고마워 할 말이 없어! – Soldier

1

문제는 컴파일러의 경고가 의미하는 관리되는 유형과 관리되지 않는 유형을 혼합 한 것입니다. 클래스는 관리되는 클래스이지만 정수 배열은 관리되지 않는 개체로 계산됩니다. 이로 인해 가비지 수집에 문제가 발생합니다. 모두 여기에 대해 읽기 :

http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx

왜 관리 배열을 사용?

+0

답장을 보내 주셔서 감사합니다. 나는이 관리되는 것에 fammilar가 아니다. 관리 배열을 만드는 방법을 알려주시겠습니까? – Soldier

+0

문제 없습니다. http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types를 읽었다면 기본적으로 모든 값/참조 유형이 어떻게되는지 설명하고 해당 구문. int의 배열은 Hans Passant가 설명한대로 선언되고 할당 된 값 유형의 배열입니다. – OOhay

관련 문제