13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 392 — #430<br />

✐<br />

Capítulo 13. Creación dinámica de objetos<br />

que que sea llamado el constructor, un acto que el compilador garantiza y que está<br />

fuera del control de este operador.<br />

El operador operator delete() toma como argum<strong>en</strong>to un puntero void* a un<br />

bloque obt<strong>en</strong>ido con el operator new(). Es un void* ya que el delete obti<strong>en</strong>e<br />

el puntero sólo después de que haya sido llamado el destructor, lo que efectivam<strong>en</strong>te<br />

elimina su caracter de objeto convirtiéndolo <strong>en</strong> un simple bloque de memoria. El tipo<br />

de retorno para delete es void.<br />

A continuación se expone un ejemplo del modo de sobrecargar globalm<strong>en</strong>te new<br />

y delete:<br />

//: C13:GlobalOperatorNew.cpp<br />

// Overload global new/delete<br />

#include <br />

#include <br />

using namespace std;<br />

void* operator new(size_t sz) {<br />

printf("operator new: %d Bytes\n", sz);<br />

void* m = malloc(sz);<br />

if(!m) puts("out of memory");<br />

return m;<br />

}<br />

void operator delete(void* m) {<br />

puts("operator delete");<br />

free(m);<br />

}<br />

class S {<br />

int i[100];<br />

public:<br />

S() { puts("S::S()"); }<br />

~S() { puts("S::~S()"); }<br />

};<br />

int main() {<br />

puts("creating & destroying an int");<br />

int* p = new int(47);<br />

delete p;<br />

puts("creating & destroying an s");<br />

S* s = new S;<br />

delete s;<br />

puts("creating & destroying S[3]");<br />

S* sa = new S[3];<br />

delete []sa;<br />

} ///:~<br />

Aquí puede verse la forma g<strong>en</strong>eral de sobrecarga de operadores new y delete.<br />

Estos operadores sustitutivos usan las funciones malloc() y free() de la biblioteca<br />

estándar de C, que es probablem<strong>en</strong>te lo que ocurre <strong>en</strong> los operadores originales.<br />

Imprim<strong>en</strong> también m<strong>en</strong>sajes sobre lo que están haci<strong>en</strong>do. Nótese que no se han usado<br />

iostreams sino printf() y puts(). Esto se hace debido a que los objetos<br />

iostream como los globales cin, cout y cerr llaman a new para obt<strong>en</strong>er memoria<br />

392<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!