将链接列表从原始指针转换为智能指针

时间:2016-10-21 01:01:26

标签: c++ c pointers doubly-linked-list

我需要将使用原始指针的双向链表的C实现转换为使用智能指针的实现。

我对智能指针有一些小经验。

我正在努力转换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;
}

我遇到这条线的问题:

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>'

有人可以提供一些提示和解释吗?

1 个答案:

答案 0 :(得分:4)

构建C++类实例时,必须使用newdelete,而不是mallocfreemallocfree是C库函数,它们对C ++类构造函数,析构函数以及与C ++类完全相关的所有其他内容完全一无所知。

显示的代码正在尝试使用node构建malloc类的实例。这是行不通的。必须使用new来构建它:

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

这比由malloc组成的C式混合物和一个丑陋的演员更加简洁整洁。

您提到您正在将C代码转换为C ++。该转化的必修部分是用mallocfree替换所有newdelete来电。这不是可选的,这是正确的C ++代码所必需的。