6

Il compilatore genera runtime segfault su seguente codice:struct contenente valore stringa provoca errore di segmentazione sul suo incarico dopo la sua creazione utilizzando l'allocazione dinamica della memoria

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

struct Node{ 
    int data; 
    void *next; 
    string nodeType; 
}; 

Node* initNode(int data){ 
    Node *n = (Node*)malloc(sizeof(Node)); 
    n->data = data; 
    n->next = NULL; 
    n->nodeType = "Node"; //if this line is commented it works else segfault 
    return n; 
} 

int main() { 
    Node *n1 = initNode(10); 
    cout << n1->data << endl; 
} 

Qualcuno può spiegare perché assegnazione delle stringhe non funziona all'interno di una struttura che viene assegnato dinamicamente dove, in caso di allocazione statica, perché funziona?

dove come il seguente modo in cui funziona:

Node initNode(string data){ 
    Node n; 
    n.data = data; //This works for node creation statically 
    n.next = NULL; 
    n.nodeType = "Node"; //and even this works for node creation statically 
    return n; 
} 

e quindi nella funzione principale:

int main() { 
    Node n2 = initNode("Hello"); 
    cout << n2.data << endl; 
} 
+1

'malloc' assegna solo memoria, non * costruisce * l'istanza dell'oggetto, il che significa che il costruttore' stringa' non viene chiamato. –

+2

Regola generale: non usare 'malloc' di C in C++, usare' new', e in realtà non usare 'new' se possibile, e usare' make_shared' o 'std :: unique_ptr' (C + +11) –

risposta

8

Questo non funziona perché non realmente costruire un'istanza Node nel memoria che si malloc.

Si dovrebbe usare new invece:

Node *n = new Node{}; 

malloc alloca memoria di sola, non ha idea di ciò che una classe è o come istanziare uno. In generale non dovresti usarlo in C++.

new alloca la memoria e costruisce un'istanza della classe.

+0

Hey yaa questo funziona: Node * n = new Node(); Ma ho pensato che malloc avrebbe effettivamente assegnato memoria creando istanza? Non è vero? puoi spiegare o dare indicazioni sulla differenza tra fare "nuovo" e "malloc" e quando usarlo? – Dhwanit

+0

Ho modificato la mia risposta con ulteriori dettagli. – TartanLlama

+0

sì giusto! Grazie! beh, in realtà ho avuto la sensazione che il costruttore della stringa sarebbe stato chiamato quando ho fatto malloc perché era una stringa e non una stringa * – Dhwanit

4

Non c'è posto dove viene eseguito std :: string constructor.

Si dovrebbe usare nuovo

example *e = new example; 

o nuova collocazione

void *example_raw = malloc(sizeof(example)); 
example *e = new(example_raw) example; 
+0

grazie funziona anche così! :) – Dhwanit

1

string in C++ è una classe e di creare oggetti stringa utilizzano new invece di malloc come di seguito.

Node *n = new Node{}; 
3
Node *n = (Node*)malloc(sizeof(Node)); 

Questo cast è una sciocchezza. Non si può semplicemente dire al compilatore di far finta che una porzione di dati che hai appena assegnato contenga un oggetto valido Node e poi lo manipoli.

+0

sì giusto!beh, in realtà ho avuto la sensazione che il costruttore della stringa sarebbe stato chiamato quando ho fatto malloc dato che era una stringa e non una stringa * all'interno del nodo – Dhwanit

Problemi correlati