첫 번째 질문에 그렇습니다. 예, LPARAM은 정수 또는 포인터로 사용하기위한 것입니다. 그 정의에서 분명하다 :
typedef LONG_PTR LPARAM;
이것은 포인터를 저장할만큼 충분히 긴 정수이다.
shared_ptr<Thing> a;
PostThreadMessage(x, 0, (LPARAM)a.get());
...
LRESULT OnMessage(int msg, WPARAM wp, LPARAM lp)
{
shared_ptr<Thing> p((Thing*)lp); //Bad!!!
}
하지만 대신이 해결 방법을 시도 할 수 있습니다 :
shared_ptr<Thing> a;
PostThreadMessage(x, 0, new shared_ptr<Thing>(a)); //pointer to smart-pointer
...
LRESULT OnMessage(int msg, WPARAM wp, LPARAM lp)
{
shared_ptr<Thing> *pp = (shared_ptr<Thing>*)lp;
shared_ptr<Thing> p(*pp);
delete pp; //no leak
}
shared_ptr의 일에 대해
, 당신은 원시 포인터를 전달하고 다른 shared_ptr의로 묶지 경우 두 번 무료 것 맞다
AFTERTHOUGHT : PostThreadMessage가 실패 할 수 있습니다 ... 그리고 shared_ptr을 누설하고 싶지는 않습니다.
내 경험에 의하면 일반적으로 데이터를 보유하고 거기에 데이터가 있음을 알리기 위해 PostThreadMessage를 사용하기 위해 std :: deque를 사용하는 것이 더 좋습니다. 이런 식으로 당신은 결코 물건을 잃지 않을 것입니다! YMMV
예, 물론입니다. WM_COPYDATA를 비교하십시오. 단순히 수신기가 메모리를 비우도록하십시오. 수신 스레드가 메시지 상자가 아닌 창을 표시하는 경우 PostThreadMessage()를 사용하지 마십시오. –
@Hans Passant 오래된 게시물 알아,하지만이 경우 PostThreadMessage()를 사용하는 것이 나쁜 이유를 간략하게 설명 할 수 있습니까? 그 결과는 무엇일까요? –