2012-05-09 82 views
13

Sé que en C++/CLI no se puede utilizar tipos no administrados cuando se define una clase administrada:¿Por qué una estructura no administrada no puede ser miembro de una clase administrada?

public struct Unmanaged 
{ 
    int x; 
    int y; 
}; 

public ref class Managed 
{ 
    int one; 
    Unmanaged two; //error C4368 
}; 

No entiendo por qué sin embargo. Unmanaged es simplemente una colección de tipos nativos: su tamaño es conocido, seguramente (y me refiero al bloque de memoria que lo define) se moverá con el 'bloque de memoria' que es Managed dentro del 'montón administrado' y cualquier compensación que se almacene en los metadatos seguirá siendo válida, ¿no? ¿Como si se declarara un entero o una carroza?

¿Por qué no podemos mezclar tipos?

+0

¿Quién espera que sea capaz de responder a una pregunta con autoridad? – ildjarn

+0

@ildjarn bien, iba a verificar el código fuente de C++/CLI y escribir una buena respuesta ... owait –

+1

Me temo que no lo entiendo; alguien con más conocimiento del funcionamiento C++/CLI que yo? Al diseñar el compilador, alguien debe haber asumido lo mismo en mi publicación (¡o la suposición es completamente errónea!), Y luego se dio cuenta de que, por alguna condición, no era cierto, de ahí el error, solo tenía curiosidad en cuanto a lo que era esa condición En la publicación de blog Tony enlazado se explicó que la asignación de tipos nativos en el montón administrado no se permitió para evitar que las personas abusaran de pin_ptr para devolver esas 'instancias' al código no administrado. – sebf

Respuesta

15

El tipo mixto se refiere en realidad a los modelos de memoria mixta. Los tipos no administrados van en el montón, los tipos administrados van en el montón recogido de basura, por lo que cuando incrusta un tipo no administrado en un administrado, requeriría memoria en ambos montones, por lo que hace este tipo de cosas con un puntero. El puntero se administra, el valor al que apunta no es.

Tenía curiosidad por mí mismo, así que recogí mi Google y encontré esto.

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

tipo parece saber lo que está hablando.

Buena pregunta, aunque ...

+0

¡Hay mucha información excelente en esa publicación, muchas gracias! Me pregunto cuántas otras características del lenguaje se han diseñado únicamente para evitar que los programadores cometan errores (cuento uno en C# como mínimo, no se pierden casos en declaraciones de interruptor) – sebf

+1

Muchos y nosotros, bueno yo: D, necesito muchos más –

Cuestiones relacionadas