더 큰 프로젝트를 해킹하는 동안 문제가 발생하여 간단한 테스트 사례를 만들었습니다. 뭔가 생략하지 않으면 테스트 코드가 제대로 작동하지만 우연히 작동하기 때문에이 접근법에 함정이 있는지 묻고 싶습니다.void *에서 캐스트/참조 해제 멤버 변수 포인터가 안전합니까?
회원 변수 (포인터) InObj가있는 OutObj가 있습니다. InObj에는 멤버 함수가 있습니다. void *와 같은 콜백 함수에이 멤버 변수 개체 (InObj)의 주소를 보냅니다. 이 객체의 유형은 결코 변경되지 않으므로 콜백 내에서 원래 유형으로 다시 작성하고 그 안에 aFunc 멤버 함수를 호출합니다. 이 예제에서 예상대로 작동하지만, 현재 작업하고있는 프로젝트에서는 그렇지 않습니다. 그래서 나는 무언가를 생략하거나 아마도 여기에 함정이있을 수 있으며 우연히 작동합니다. 다른하실 말씀 있나요? 많은 감사드립니다.
(원래 코드에있는 문제는 InObj.data가 쓰레기라는 것입니다.)
#include <stdio.h>
class InObj
{
public:
int data;
InObj(int argData);
void aFunc()
{
printf("Inside aFunc! data is: %d\n", data);
};
};
InObj::InObj(int argData)
{
data = argData;
}
class OutObj
{
public:
InObj* objPtr;
OutObj(int data);
~OutObj();
};
OutObj::OutObj(int data)
{
objPtr = new InObj(data);
}
OutObj::~OutObj()
{
delete objPtr;
}
void callback(void* context)
{
((InObj*)context)->aFunc();
}
int main()
{
OutObj a(42);
callback((void*)a.objPtr);
}
, 그것을 잘 보인다. 앱에서 "작동하지 않음"을 정의하십시오. – Stephen
프로젝트에서 직면 한 정확한 문제점은 무엇입니까? – Canopus
원래 코드에서 가지고있는 문제는 InObj.data가 쓰레기라는 것입니다. 그래서 이것이 괜찮아 보인다면 잠을 자고 코드에서 명백한 버그를 찾아야합니다. – Damien