Jan 10
Let’s say you have the following unmanaged code:
-
#pragma unmanaged
-
-
class Stream { … }; // Conceptual stream class
-
-
class StreamWriter
-
{
-
public:
-
StreamWriter(Stream* pStream) : m_pStream(pStream) {}
-
~StreamWriter() { /* Use m_pStream in some way */ }
-
-
…
-
private:
-
Stream* m_pStream;
-
};
-
-
void f()
-
{
-
Stream stream;
-
StreamWriter streamWriter(&stream);
-
-
// Use streamWriter
-
-
// streamWriter is destroyed
-
// stream is destroyed
-
}
Note that StreamWriter’s destructor uses m_pStream (perhaps by flushing the stream). This means that the order of destruction is important — StreamWriter must be destroyed before its underlying Stream is.
Now let’s try to write and use some simple managed C++ wrappers for these classes:
-
#pragma managed
-
-
public __gc class ManagedStream
-
{
-
public:
-
ManagedStream() : m_pStream(new Stream) {}
-
-
// NOTE: This is a finalizer, not a determinstic destructor
-
~ManagedStream() { delete m_pStream; }
-
-
public private: // Make accessible by ManagedStreamWriter
-
Stream __nogc* m_pStream;
-
};
-
-
public __gc class ManagedStreamWriter
-
{
-
public:
-
ManagedStreamWriter(ManagedStream* pStream) :
-
m_pStreamWriter(new StreamWriter(pStream->m_pStream)) {}
-
-
// NOTE: This is a finalizer, not a determinstic destructor
-
~ManagedStreamWriter() { delete m_pStreamWriter; }
-
-
private:
-
StreamWriter __nogc* m_pStreamWriter;
-
};
-
-
void f()
-
{
-
ManagedStream stream = __gc new ManagedStream();
-
ManagedStreamWriter streamWriter =
-
__gc new ManagedStreamWriter(stream);
-
-
// Use streamWriter
-
-
// GC will clean up stream and streamWriter
-
}
See the problem?
Recent Comments