×
Ir ao conteúdo
  • Cadastre-se

C++ Destruir uma struct, é possível?


Talyson Maia
Ir à solução Resolvido por arfneto,

Posts recomendados

Olá, boa tarde. Estou estudando estrutura de dados e absorvendo o máximo de conteúdo através de um livro (já que não estou achando tanta coisa na internet). Todavia, fiquei preso em um assunto de uma aula por causa de um exercício. Eu não estou conseguindo resolver a segunda função e não tenho certeza sobre a minha resposta na primeira. Alguém poderia me dá uma luz sobre a segunda função (Vetor_destroi).

obs.: O que está dentro das funções são as minhas respostas ou comando do que é para fazer.

 

#include <iostream>
#include <sstream>
using namespace std;

struct Vetor {
    int capacidade;
    int tam;
    int * data;
};

Vetor * Vetor_criar(int capacidade) {
    Vetor *data = new Vetor[capacidade];
    tam = 0;
    this->capacidade = capacidade;

    return data;
}

void Vetor_destroi(Vetor * vetor) {
    //destrua data
    //destrua a struct
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Midori @Midori Isso, desalocar memória. Acho que não fui muito específico no meu enunciado. 

Eu também fazer assim: 

void vetor_destroi(Vetor * vetor) {

    //destrua data

    delete [] data;

    //destrua a struct

    delete Vetor *vetor;

}



você acha que ta correto?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução
2 horas atrás, Talyson Maia disse:

Estou estudando estrutura de dados e absorvendo o máximo de conteúdo através de um livro (já que não estou achando tanta coisa na internet)

 

Um livro é uma boa opção, se for um bom livro :) 

Mas estranho dizer que ~não acha muita coisa~ na internet. O que está procurando? Como está procurando?

 

2 horas atrás, Talyson Maia disse:

fiquei preso em um assunto de uma aula por causa de um exercício

 

Podia ter postado o tal exercício. ;) 

 

2 horas atrás, Talyson Maia disse:

Alguém poderia me dá uma luz sobre a segunda função (Vetor_destroi).

obs.: O que está dentro das funções são as minhas respostas ou comando do que é para fazer.

 

Está re-criando um vetor. C++ tem vetores para uso em <vector>, mas em C uma struct assim serviria bem. 

 

Seu programa não está muito bom ainda. E tem um erro importante. E está programando praticamente em C e não em C++. E é muito mais vantagem programar em C++ essas coisas.

 

De volta ao programa

 

struct Vetor
{
    int  capacidade;
    int  tam;
    int* data;
};

Vetor* Vetor_criar(int capacidade)
{
    Vetor* data      = new Vetor[capacidade];
    tam              = 0;
    this->capacidade = capacidade;

    return data;
}

 

Aposto que pretendia alocar algo de um certo tamanho em data... Pense nisso. Esse é o vetor que quer criar. E aí a nomenclatura fica realmente confusa.

 

Provavelmente você quer alocar um vetor de int com uma certa capacidade e colocar dentro da struct. E não alocar um vetor da strut que tem um vetor dentro. E esse é o erro. Alocou o Vetor, mas esse não é o vetor que quer ;) Seu vetor é data[] dentro da struct Vetor

 

Em C++, mas em C :) 

 

Isso é o que imagino que queria fazer. É criado um vetor de 300 caras e destruído em seguida. Só coloquei um valor no último item como exemplo. Não vai usar assim porque vai usar tam para controlar o tamanho:

 

#include <iostream>
using namespace std;

struct Vetor
{
    int  capacidade;
    int  tam;
    int* data;
};

Vetor* Vetor_criar(int capacidade)
{
    Vetor* novo = new Vetor;
    novo->tam = 0;
    novo->capacidade = capacidade;
    novo->data       = new int[capacidade];
    return novo;
}

Vetor* Vetor_destroi(Vetor* vetor)
{
    // destroi ao contrario
    delete[] vetor->data;
    delete vetor;
    return nullptr;
}

int main(void)
{ 
    Vetor* um            = Vetor_criar(300);
    um->data[299] = 42;
    cout << "Ultimo valor do vetor: " << um->data[299] << "\n";
    um = Vetor_destroi(um);
    return 0;
}

 

É esperto retornar nullptr de Vetor_destroi() porque assim pode invalidar o ponteiro na mesma linha e nunca vai ter um ponteiro inválido e vivo em seu programa.

 

A saída

 

Ultimo valor do vetor: 42

 

O normal em C++
 

#include <iostream>
using namespace std;

struct Vetor
{
    int  capacidade;
    int  tam;
    int* data;
    Vetor(int c) : tam(0), capacidade(c) { data = new int[c]; }
    ~Vetor() { delete[] data; }
};

int main(void)
{
    Vetor* um = new Vetor(300);
    um->data[299] = 42;
    cout << "Ultimo valor do vetor: " << um->data[299] << "\n";
    return 0;
}

 

Compare os dois programas. A saída é a mesma. O segundo é mais certo.

 

 

 

 

 

 

 

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

22 horas atrás, Talyson Maia disse:
void Vetor_destroi(Vetor * vetor)

se vetor for um objeto reservado dinamicamente você sim pode liberar, caso contrario n. Para ficar mais claro você poderia passar o enunciado completo.

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!