2016-07-16 4 views
1

Im triying для компиляции и выполнения этого небольшого кода C++ с использованием g ++ 5.1, он скомпилирован в порядке, когда я его выполняю на linux. Я получаю это сообщение об ошибке: «Segmentation fault (core dumped)».C++: ошибка сегментации (core dumped) On linux OS

Но тот же код запуска правильно на OSX, но не на Linux:

#include <iostream> 
#include <string.h> 
#include <stdlib.h> 
#include <string.h> 
using namespace std; 

struct node { 
std::string data; 
}; 

int main() { 
    struct node * node = (struct node *) 
    malloc(sizeof(struct node)); 

    node->data.assign("string"); 
    // node->data = "string" --> same issue 

    return 0; 
} 

я попытался простой assigne (node-> данные = «строка»), но я получил ту же самую проблему Любая помощь, пожалуйста!

+5

Почему вы используете 'malloc' в коде на C++? 'new' инициализирует строковый объект -' malloc' не делает. –

+1

Кто продолжает преподавать такие вещи? Не случается ли для тех людей, что 80-е годы закончились? :/ –

+1

Чтобы расширить то, что сказал @EdHeal: недостаточно просто выделить байты sizeof (struct node) и затем начать их использовать. Вы должны также убедиться, что конструктор строкового объекта также запущен, так что частное состояние объекта узла будет инициализировано правильно. Для этого вам нужно использовать новый оператор (например, node = struct node * node = new node;) –

ответ

5

Вы не можете malloc строку C++. Вы должны использовать по умолчанию new и delete, чтобы вызвать конструкторы. Прекратите использование C в C++.

В идеале вы бы даже не использовали new; просто иметь нормальный объект с автоматическим временем хранения или, если вам отчаянно требуется динамическое распределение, std::make_unique.

Нет необходимости в ручном управлении памятью в 2016 году.

+1

'Нет необходимости в ручном управлении памятью в 2016 году. Думаю, я могу выбросить свои пользовательские распределители, тогда .. :( –

+0

@ Планы на орбите: вы имеете в виду умный указатель на ручную память – solti

+1

Да, вот почему 'make_unique' возвращается в конце концов. –

5

С C++ забыть о malloc(). Если вы хотите, чтобы выделить объект с помощью new:

node * n = new node; // or if your variable should be called node 
         // you'd need new struct node to disambiguate 

Проблемы с malloc() является то, что он просто выделяет неинициализированную память. Он не обеспечивает семантику C++ создания объекта. Таким образом, строка внутри вашего узла не инициализируется до допустимого состояния. Это приводит к присвоению этой строки UB.

Если бы действительно нужно использовать malloc() в C++, вы должны были бы использовать placement new после инициализации объекта в действительном состоянии (online demo).

void *p = malloc(sizeof(node)); // not so a good idea ! 
node *n2 = new (p)node;   // but ok, it's feasible. 
+0

Почему строка должна быть инициализирована, так как он заменяет то, что когда-либо было там с «строкой» ... также как новый вызывает уверен, что конструктор строки вызывается? – solti

+3

@solti Вот что делает 'new', он выделяет память и вызывает конструктор. –

+1

@GillBates, поскольку строка не построена (потому что конструктор не вызывается для строки), поэтому segfault? – solti

Смежные вопросы