class Nstring { class RefCnt { unsigned m_n; // cantidad de referencia a este objeto char * m_s; // la hilera ~RefCnt() { delete [] m_s; } // borra su propia memoria dinámica friend void release( RefCnt * ); friend class Nstring; }; // RefCnt // ... }; // Nstring void release( Nstring::RefCnt * m_ref ) { m_ref->m_n--; // desliga if ( m_ref->m_n == 0 ) { // destruye si es el último delete m_ref; } } // OJO: release() es una función... ˇ no es un método ! /*==================================================*\ || Programa C++ original || \*==================================================*/ { Nstring::RefCnt * m_ref; // ... m_ref = new Nstring::RefCnt( "Banana" ); // ... delete( m_ref ); // m_ref->~Nstring::RefCnt(); free( m_ref ); // ... } /*==================================================*\ || Programa C resultado || \*==================================================*/ void free(void *block); void *malloc(size_t size); { Nstring::RefCnt * m_ref; // ... // m_ref = new Nstring::RefCnt( "Banana" ); m_ref = alloc( sizeof(Nstring::RefCnt) ); // obtiene memoria dinámica m_ref->Nstring::RefCnt( "banana" ); // inicializa con el constructor // ... // delete( m_ref ); m_ref->~Nstring::RefCnt(); // destruye con el destructor // el destructor retorna la memoria de "m_s" free( m_ref ); // devuelve la memoria dinámica // ... } /*==================================================*\ || Especificación BC++ v3.1 || \*==================================================*/ #include /// \c "malloc()" allocates a block of \c "size" bytes from the memory heap. /// - It allows a program to allocate memory explicitly as it's needed, /// and in the exact amounts needed. /// - The heap is used for dynamic allocation of variable-sized blocks of memory. /// - Many data structures, such as lists, naturally employ heap memory allocation. void *malloc(size_t size); /// \c "free()" deallocates a memory block allocated by a previous call to /// \c "calloc()", \c "malloc()", \or \c "realloc()". void free(void *block);