Problema allocazione dinamica campo struct. C++

di il
3 risposte

Problema allocazione dinamica campo struct. C++

Ciao a tutti, sono nuovo sia del forum che della programmazione in C++ in generale. Sto cercando di avvicinarmi pian piano ma purtroppo ho riscontrato un problema di crash della workstation, non individuato dal DEV in fase di compilazione. Se foste in grado di darmi una mano ve ne sarei grato!
#include <iostream>
#include <cstdlib>
using namespace std;

struct punto3d{
       char* nome;
       float x,y,z;
       };

void leggepunto3d(struct punto3d*&, int);
void leggevettorepunti3d(struct punto3d*, int);

int main(){
    int n;
    struct punto3d* p;
    cout<<"Quanti punti si vogliono immettere? ";
    cin>>n;
    p=new struct punto3d[n];
    if(p!=NULL){
                cout<<"\nMemoria Heap assegnata \n\n";
                };
    leggepunto3d(p,n);
    leggevettorepunti3d(p,n);
    delete [] p;
    system("PAUSE");
    return 0;
    }

void leggepunto3d(punto3d* &punto, int num){
     punto->nome=new char[num];
     for(int i=0; i<num; i++){
             cout<<"Inserire il nome del punto "<<i<<": ";
             cin>>punto[i].nome;
             cout<<"Inserire il parametro x del punto "<<i<<": ";
             cin>>punto[i].x;
             cout<<"Inserire il parametro y del punto "<<i<<": ";
             cin>>punto[i].y;
             cout<<"Inserire il parametro z del punto "<<i<<": ";
             cin>>punto[i].z;
             };
     }

void leggevettorepunti3d(punto3d* punto, int num){
     for(int i=0; i<num; i++){
             cout<<"Il nome del punto "<<i<<" e': "<<punto[i].nome<<endl;
             cout<<"Il punto "<<i<<" ha coordinate ("<<punto[i].x<<","<<
             punto[i].y<<","<<punto[i].z<<")"<<endl;
             };
     }
Il problema in questione avviene nel momento in cui vado ad immettere un secondo valore al campo punto.nome. Tecnicamente non ho capito come allocare dinamicamente spazio per un campo di una struct che sia un char* o un qualsiasi altro tipo predefinito.

3 Risposte

  • Re: Problema allocazione dinamica campo struct. C++

    Lo allochi come per la struct, indicando il valore di caratteri da inserire.
    
    punto[i].nome = new char[dimensione];
    
    Poi però lo devi deallocare quando non ti serve più.
    Meglio se usi una std::string al posto di char*
    
    #include <string>
    ...
    struct punto3d{
           std::string nome;
           float x,y,z;
           };
    ...
    
    getline(cin,punto[i].nome;
    
    e ti risparmi un sacco di grattacapi.
    Nota a margine.
    
    if(p!=NULL){
    
    Questo controllo è inutile. operator new[] lancia un'eccezione se non trova memoria da allocare. Se non lo fa, p è semrpe valido.
    [/code]
  • Re: Problema allocazione dinamica campo struct. C++

    Ti ringrazio, adesso funziona tutto e penso di aver capito il concetto base di allocazione dinamica dei campi.
    L'operatore delete per quanto riguarda il campo della struct lo uso in questo modo:
    delete [] p[n].nome;
    oppure sto sbagliando?
  • Re: Problema allocazione dinamica campo struct. C++

    No, è giusto: qualunque cosa si allochi con new[] va deallocato con delete[]. Sempre.
    Deallocare con l'operatore sbagliato ha comportamento indefinito.
    Ricorda però che quella deallocazione ha effetto solo sul campo nome (che è una array di char), non sull'array di strutture.
Devi accedere o registrarti per scrivere nel forum
3 risposte