Ir ao conteúdo

Posts recomendados

Postado
#include <iostream>

using namespace std;

int main(void){
	
	int * Parray = new int[10];
	
	for(int i = 0; i < 10; i++){
		
		Parray[i] = i;
		
		cout << "Posicao: " << i << " = " << *(Parray + i) << endl;
	}
	

	cout << endl << endl;
	
	delete[] Parray;
	
	for(int i = 0; i < 10; i++){
		
		cout << "Posicao: " << i << " = " << *(Parray + i) << endl;
	}
		
	return 0;
}

Porque só os dois primeiros valores estão sendo deletados? 

Como Deletar Todos?

  • Curtir 1
  • Membro VIP
Postado

Olá a todos.

 

Não manjo muito, mas vou tentar repassar o que estou supondo:

 

21 horas atrás, vitor de jesus disse:

Porque só os dois primeiros valores estão sendo deletados? 

Como Deletar Todos?

@vitor de jesus, na verdade nenhum dos valores estão sendo deletados, pois o delete[] se refere ao alocamento de memória, e não ao seu conteúdo que está lá. São coisas distintas..

 

Como você mesmo sugere no título, apenas está "desalocando", ou seja, é o oposto do new()... simplesmente vai deixar aquele espaço disponível para acesso. Ficará liberado. Faria mais sentido chamar o comando de Deallocate[]. Entende?

 

Por quê só alguns valores ficam corrompidos (ou que os outros não são) eu não dizer... apesar de curioso, acho que não é tão importante, apenas que após "deletar" você não poderia mais tentar imprimir (usar aquela variável de qualquer forma), pois ele foi "desalocado"... é como tentar usar um ponteiro que ainda não sofreu um new(), a diferença, suponho eu, é que aquela região ("lixo") de memória já está com a mesma estrutura de quando foi alocada (não deu tempo de ser utilizada por outro recurso do programa ou Sistema Operacional), daí ainda consegue exibir dados sem "dar pau".

 


Se você quer "apagar o conteúdo" que está na variável, ou seja, que na verdade estaria querendo "sobrescrever" por outro valor, ai você poderia usar o que @devair1010 sugere:

11 horas atrás, devair1010 disse:

for(int i=0;i<10;i++){
    Parray[i]=NULL;
}

 

obs.: aqui está dando um "alerta":

Citação

[Warning] converting to non-pointer type 'int' from NULL [-Wconversion-null]

 

Ou seja, o "mais correto" seria simplesmente fazer:

	for(int i=0;i<10;i++){
 	   Parray[i]=0;
	}

 

Veja, na computação não existe "deletação", apenas "liberação". Quando você apaga um arquivo do computador, ele não é "excluído", é apenas "marcado como excluído", daí o SO finge que ele não existe. A melhor prova disso é quando você copia uma arquivo grande, como uma ISO de um SO ou um filme em Full HD... perceba que demora certo tempo, mas para apagar é praticamente instantâneo... um "shift+del" é como um "Delete[]". Tipo, se você apagar um filme com ele aberto, o "player" poder continuar rodando ele normalmente. Pois os dados estão lá ainda!

 

Nesse mesmo conceito... existem ferramentas que fazem (tentam fazer) "exclusão definitiva". Nela, além de apagar a referência, é escrito bit a bit algo por cima, como um monte de 0.

 

"Na natureza nada se cria, nada se perde, tudo se transforma."

 

 

No aguardo.

  • Curtir 2
Postado
4 horas atrás, Simon Viegas disse:

Por quê só alguns valores ficam corrompidos (ou que os outros não são) eu não dizer... apesar de curioso, acho que não é tão importante, apenas que após "deletar" você não poderia mais tentar imprimir (usar aquela variável de qualquer forma), pois ele foi "desalocado"... é como tentar usar um ponteiro que ainda não sofreu um new(), a diferença, suponho eu, é que aquela região ("lixo") de memória já está com a mesma estrutura de quando foi alocada (não deu tempo de ser utilizada por outro recurso do programa ou Sistema Operacional), daí ainda consegue exibir dados sem "dar pau".

 

Deixa eu ver se entendi:

 

O espaço que foi "reservado" na memoria para o ponteiro (Parray) já foi desalocado "Liberado", e na verdade não esta sendo exibido os valores para que (Parray)  "aponta", pois não tenho mais acesso a ele?

 

Apesar da memoria alocada já ter sido liberada, a "estrutura" do (Parray) ainda não foi modificada sendo possível exibir parte de seus valores originais? pois aquele espaço ainda não foi utilizado?

 

@Simon Viegas  --> após "deletar" você não poderia mais tentar imprimir (usar aquela variável de qualquer forma), pois ele foi "desalocado"

 

@Simon Viegas suponho eu, é que aquela região ("lixo") de memória...

 

mas aí que surgiu outra duvida... ao  tentar acessar (Parray) não deveria dar algum tipo de error no programa, pois se o espaço reservado a (Parray) já foi liberado, não deveria conseguir acessa-la e nem os endereços de memoria para que ela apontava?

 

ou essa região "lixo" continua sendo a mesma reservada a (Parray) e ela foi apenas "classificada"  como disponivel para uso...

 

por isso estou conseguindo acessar o "lixo" através do (Parray) que no caso já foi desalocado?

 

e como você disse:  está com a mesma estrutura de quando foi alocada (não deu tempo de ser utilizada por outro recurso do programa ou Sistema Operacional)

 

Enfim.. então quer dizer que não tem nenhum "error" do modo que estou alocando e desalocando a memoria, só não deu tempo do "Lixo" ser utilizado?

 

 

adicionado 5 minutos depois
15 horas atrás, devair1010 disse:

@vitor de jesus    esse comando delete é complicado,  experimente usar esse código no lugar de delete :


for(int i=0;i<10;i++){
    Parray[i]=NULL;
}

 

 

Mas ai não estaria liberando memoria né?, só fazendo com que o ponteiro não "aponte para nada", o espaço reservado a (Parray) não seria  "liberado" ou seria?

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!