Kompilator rzuca wykonania segfault na następujący kod:struct zawierający ciąg znaków powoduje błąd segmentacji na jego zlecenie po jego utworzeniu za pomocą alokacji pamięci dynamicznej
#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;
}
Czy ktoś mógłby wyjaśnić, dlaczego przypisanie ciąg nie działa wewnątrz struktury, które jest przydzielany dynamicznie, gdzie w przypadku alokacji statycznej, dlaczego działa?
gdzie w następujący sposób to działa:
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;
}
a następnie w głównym funkcji:
int main() {
Node n2 = initNode("Hello");
cout << n2.data << endl;
}
'malloc' po prostu przydziela pamięć, nie * konstruuje * instancji obiektu, co oznacza, że konstruktor' string' nie jest wywoływany. –
Ogólna zasada: nie używaj C 'malloc' w C++, używaj' new', a właściwie nie używaj 'new' jeśli to możliwe, i używaj' make_shared' lub 'std :: unique_ptr' (C + +11) –