2016-10-21 7 views
0

Мне нужно преобразовать реализацию C из дважды связанного списка, который использует необработанные указатели, вместо реализации с использованием интеллектуальных указателей.Преобразование связанного списка из исходных указателей в интеллектуальные указатели

У меня есть небольшой опыт с умными указателями.

Im работает над преобразованием функции insertFirst(), чтобы понять и понять, как это будет происходить вместе.

struct node { 
    int data; 
    int key; 

    std::shared_ptr<node> next; 
    std::weak_ptr<node> prev; 
}; 

void insertFirst(int key, int data){ 

    //create a link 
    //struct node *link = (struct node*) malloc(sizeof(struct node)); 

    std::shared_ptr<node> link = (std::shared_ptr<node>) malloc(sizeof(struct node)); 

    link->key = key; 
    link->data = data; 

    if(isEmpty()){ 
    //make it the last link 
    last = link; 
    }else { 
    //update first prev link 
    head->prev = link; 
    } 

    //point it to old first link 
    link->next = head; 

    //point first to new first link 
    head = link; 
} 

Im возникли проблемы с этой линии:

struct node *link = (struct node*) malloc(sizeof(struct node));

Я думал, что делать так:

std::shared_ptr<node> link = (std::shared_ptr<node>) malloc(sizeof(struct node));

все, что мне нужно было. Но я менее знаком с C и что именно происходит и почему это не разрешено.

я получаю ошибку:

no matching conversion for C-style cast from 'void *' to 'std::shared_ptr<node>'

Может кто-нибудь предложить некоторые советы и объяснения?

+0

Вы не можете использовать 'malloc' для' node', потому что он не будет правильно его строить, вы должны использовать 'std :: make_shared' (или, по крайней мере,' new'). Кстати, вам действительно нужны * общие * указатели? – Galik

+0

Вам не нужны общие указатели, но с момента появления C++ 11 более профессионально использовать 'shared_ptr'' weak_ptr' и 'make_shared' вместо использования' new' и 'delete' –

ответ

4

При построении C++ экземпляров класса, вы должны использовать new и delete, вместо malloc и free. malloc и free - это библиотечные функции C, которые абсолютно ничего не знают о конструкторах класса C++, деструкторах и обо всем остальном, что связано с тем, что такое класс C++.

Показанный код пытается построить экземпляр класса node, используя malloc. это не сработает. new должны быть использованы для построения его:

std::shared_ptr<node> link = new node; 

Это еще короче и аккуратнее, чем басни C-стиля, состоящих из malloc и уродливой гипсе.

Вы упомянули, что находитесь в процессе преобразования кода C в C++. Обязательной частью этого преобразования является замена всех malloc и free звонков с new и delete. Это необязательно, это необходимо для правильного кода на C++.

+0

Спасибо за быстрый ответ. Я нашел хорошую статью, которую мне нужно прочитать, чтобы получить дополнительное представление об использовании общих указателей. Я считаю, что цель здесь состоит в том, чтобы устранить любые вызовы 'new' и' delete' и вместо этого выполнить все выделение и освобождение с помощью 'shared_ptr' и' make_shared' –

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