Referências, em C++, são ‘absolutamente’ seguras?

A preferência pelo uso de referências sobre ponteiros, em C++, é por causa da notação desses últimos. Por que você faria algo assim:

void f(int *x) { *x = 3; }

Quando poderia fazer algo assim:

void f(int& x) { x = 3; }

Certo? No fim das contas ambas são ponteiros, só que a última notação esconde esse fato. Ainda, referências sempre referenciam algo. Em teoria não é possível referenciar NULL, por exemplo… Na teoria! Na prática você sempre pode fazer algo assim:

int *p = NULL;
int& r = *p;

std::cout << r << '\n';

O compilador não reclamará e, ao executar isso, você tomará um belo e formoso “Segmentation fault” na cara! Isso ai pode parecer um caso extremo, improvável, mas considere:

extern void f(MyType& r);

MyType *p = new MyType;

f(*p);

Ao manipular a referência dentro da função f a coisa pode explodir na sua cara se a alocação do objeto da classe MyType falhar!

Referências não são panaceias! Eu prefiro os ponteiros… Pelo menos, com eles, sei que tenho que testá-los antes de usá-los! De novo, C rules!

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s