Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐