6

Der Compiler Laufzeit segfault auf folgenden Code wirft:struct Stringwert enthält, verursacht Segmentierungsfehler auf seine Aufgabe nach ihrer Gründung mit dynamischen Speicherzuweisung

#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; 
} 

Kann jemand bitte erklären, warum Zeichenfolge Zuordnung nicht innerhalb einer Struktur funktioniert das wird dynamisch zugewiesen, wo im Falle einer statischen Zuweisung, warum es funktioniert?

wo wie folgt funktioniert es:

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; 
} 

und dann in der Hauptfunktion:

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

'malloc' weist nur Speicher zu, es konstruiert * die Objektinstanz nicht, was bedeutet, dass der Konstruktor' string' nicht aufgerufen wird. –

+2

Allgemeine Faustregel: Verwenden Sie in C++ nicht Cs "malloc", verwenden Sie "new", und verwenden Sie, falls möglich, auch nicht "new" und verwenden Sie "make_shared" oder "std :: unique_ptr" (C + +11) –

Antwort

8

Das funktioniert nicht, weil Sie eine Node Instanz in der nicht wirklich bauen Speicher, den Sie malloc.

sollten Sie new statt:

Node *n = new Node{}; 

malloc nur Speicher reserviert, es hat keine Ahnung, was eine Klasse ist, oder wie man instanziieren. Sie sollten es generell nicht in C++ verwenden.

new Zuweisen von Speicher und erstellt eine Instanz der Klasse.

+0

Hey yaa das funktioniert: Knoten * n = new Node(); Aber ich dachte, dass malloc tatsächlich Speicher zuweisen würde, indem Instanz erstellt? Ist das nicht wahr? Kannst du bitte erklären oder Hinweise zum Unterschied zwischen "neu" und "malloc" geben und wann es verwenden? – Dhwanit

+0

Ich habe meine Antwort mit mehr Details bearbeitet. – TartanLlama

+0

yup richtig! Vielen Dank! Nun, ich hatte tatsächlich das Gefühl, dass der Konstruktor der Zeichenkette aufgerufen würde, als ich malloc tat, da es eine Zeichenkette und keine Zeichenkette war. – Dhwanit

4

Es gibt keinen Platz, wo std :: string -Konstruktor ausgeführt wird.

sollten Sie neue verwenden

example *e = new example; 

oder Platzierung neuer

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

danke yup es funktioniert auch so! :) – Dhwanit

1

string in C++ eine Klasse ist und String-Objekte new statt malloc wie unten verwenden zu erstellen.

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

Diese Besetzung ist Unsinn. Sie können dem Compiler nicht einfach vorgeben, dass ein Datenblock, den Sie gerade zugewiesen haben, ein gültiges Node-Objekt enthält, und manipulieren Sie es dann.

+0

yup richtig!Nun, ich hatte tatsächlich das Gefühl, dass der Konstruktor der Zeichenkette aufgerufen würde, wenn ich malloc als Zeichenkette und nicht als Zeichenkette * innerhalb des Knotens ausführen würde – Dhwanit