2010-01-29 14 views
6

En Win32 para pegar datos en el portapapeles tengo que llamar a GlobalAlloc(), luego GlobalLock() para obtener un puntero, luego copiar datos, luego llamar a GlobalUnlock() y SetClipboardData().¿Qué sucede si llamo a GlobalLock() y luego no puedo llamar a GlobalUnlock()?

Si el código está en C++ una excepción podría ser lanzado entre llamadas a GlobalLock() y GlobalUnlock() y si no me encargo de esto GlobalUnlock() no se llamará.

¿Esto es un problema? ¿Qué sucede exactamente si llamo al GlobalLock() y por alguna razón me salteo una llamada de emparejamiento GlobalUnlock()?

Respuesta

9

La pregunta no es solo acerca de si o no si llama al GlobalUnlock(). Debe llamar al GlobalUnlock() y GlobalFree(). Se deben invocar ambos para liberar la memoria que asignó:

HGLOBAL hdl = NULL; 
void *ptr = NULL 

    try { 
    hdl = GlobalAlloc(); 
    ptr = GlobalLock(hdl); 

    // etc... 
    GlobalUnlock(hdl); 
    ptr = NULL; 
    SetClipboardData(..., hdl); 
    } 
    catch (...) { 
    if(ptr) 
     GlobalUnlock(hdl); 
    if(hdl) 
     GlobalFree(hdl); 
    throw; 
    } 

La fuga sería aplicable a toda la aplicación. Cuando sale de una aplicación de Windows, toda la memoria privada asignada se libera automáticamente

+1

No, no se debe invocar GlobalFree() si los datos se pegan en el portapapeles: la propiedad pasa al clipborad y liberará la memoria una vez más tarde. – sharptooth

+1

Sí, tiene razón, si la llamada a SetClipboardData se ha realizado correctamente. Pero, de lo contrario, debe llamar a ambos. Publicación modificada en consecuencia. –

9

Más de lo que siempre quiso saber (en realidad) sobre GlobalLock(), cortesía de Raymond Chen:

Estoy marcando esta wiki de la comunidad porque en realidad no sé si estos artículos responden a su pregunta. Pero probablemente valen la pena, al menos por un descuido.

Pero una forma de manejar su problema de tratar con GlobalUnlock() frente a las excepciones es usar una clase RAII para administrar las llamadas GlobalLock()/GlobalUnlock().

Cuestiones relacionadas