Dúvida em relação à String

Galera, sou novo aqui no fórum, este é o meu primeiro post :smiley:
Venho com uma dúvida da qual preciso esclarecimento breve, isto é, rápido, mas sem abusar da boa vontade de vocês ^^

Bem, o negócio é o seguinte. Eu já vi bastante a respeito de C e agora, como estou iniciando em POO, acabei me deparando com um paradigma.
Como já se sabe, o Java dispõe de uma “ferramenta” chamada Garbage Collector (me corrijam se estiver errado). Essa thread limpa a porcariada que fica solta sem dono na memória, seja quando um escopo termina, ou quando há uma desalocação voluntária por parte da aplicação.
OK, até ai tudo bem, ele faz o serviço sujo, o que deixa alguns procedimentos talvez até mais inteligentes e menos sobrecarregados em termos de consumo de memória. Entretanto, o C/C++ não possui essa facilidade, e a idéia de não se atentar as tais referências (os ponteiros) pode chegar ao ponto de criar uma “bomba” e explodir justo num momento inoportuno. Pensando nisso, eu sempre procuro sanar as dúvidas em relação as alternativas do uso de ponteiros para evitar armadilhas como segmentation fault, buffer overrun, etc.
Afinal, a questão é: como seria uma função do seguinte tipo (C++) implementada em Java?

void setRua(const char r, char *rua) { while(*rua++ = *r++); }

Eu, particularmente já vi coisas do tipo

void setRua(String r) { rua = r; //Supõe-se "rua" como um atributo da classe Endereco, por exemplo. }
e me deixaram intrigado, pois há um grande perigo em trabalhar com uma String que não teve um espaço reservado na memória, isto é, uma constante. Será que ao atribuir para uma memória sem alocação prévia não dará nenhum problema? Uma invasão de memória? Falha de seguementação?

Aguardo sugestões! Já agradeço antecipadamente.
[]s,
Exploit.

Bom, em primeiro lugar, toda String no java tem seu espaço em memória reservado. Seja ela constante ou não constante.

Como não existe free(), delete, ou construções que explicitamente limpem um objeto da memória, também não existirão os dangling pointers, o que elimina o risco de um segmentation fault. Nada de variáveis apontando para conteúdo deletado.

O java também não trabalha com ponteiros (só com referências &), assim, é impossível criar um ponteiro que aponte para um endereço inválido, movimentar ponteiros para uma região não reservada de memória, etc.

A única coisa que pode existir em java são os memory leaks. Para isso, basta que você esqueça uma referência presa há uma variável em algum lugar. Infelizmente, esse lugar nem sempre é tão óbvio.

Também pode existir uma referência apontando para NULL. Nesse caso, no lugar de um segmentation fault sem informação nenhuma, você obterá uma NullPointerException, com toda pilha de onde o problema ocorreu, linha a linha.

Na construção:

void setRua(String r) { rua = r; //Supõe-se "rua" como um atributo da classe Endereco, por exemplo. }

Tudo o que você está fazendo é referenciar na variável rua (interna da classe) o que está no local da variável r. Como r com certeza é uma string alocada, e como não será desalocada a menos que rua também fique sem referência, esse código se torna seguro. Note que isso é válido mesmo que o escopo de r seja menor que o de rua, como no caso de uma variável local:

[code]private Endereco e;

public void definirRua()
{
String r = “Rua dos bobos, número 0”;
e.setRua®;
} [/code]

O código acima está ok. Embora a referência r (local) seja coletada, o conteúdo para o qual aponta não será, pois está sendo referênciado a partir da classe endereço, que tem um escopo maior.

Ou seja, meu amigo, embora o Java trabalhe com referências que realmente se parecem com ponteiros, esqueça da absurda maior parte das dores de cabeça que a manipulação direta de memória te causava. E pode trabalhar tranquilo. :wink:

Vini, muito obrigado pelo esclarecimento. Embora meu professor prefira ensinar os conceitos de POO para C++ e Java ao mesmo tempo, aposto que agora não irei mais confundir os possíveis problemas de memória, pois como você mesmo disse, devo me atentar apenas com os Memory Leaks.
Bem, caso surja outra dúvida não hesistarei em abrir outro tópico (é claro que pretendo contribuir para a comunidade também :D).

Um grande abraço,
Exploit.

Tranquilo. Aqui eu e o thingol tipicamente respondemos os tópicos envolvendo C e C++.