您如何使用从字符串访问信息*?

Posted

技术标签:

【中文标题】您如何使用从字符串访问信息*?【英文标题】:How do you use access the information from a string*? 【发布时间】:2019-02-09 19:18:25 【问题描述】:

我正在使用双向链表,并且我正在尝试使用通过引用传递的数据在所述数据之前插入一个节点。我使用string* data = new string(s); 分配内存,但是当我尝试使用数据时出现错误。

    #ifndef __DOUBLYLINKEDLIST_H__
    #define __DOUBLYLINKEDLIST_H__
    //
    //
    #include
    #include
    using namespace std;

    class DoublyLinkedList 
    public:
      DoublyLinkedList();
      ~DoublyLinkedList();
      void append (const string& s);
      void insertBefore (const string& s);
      void insertAfter (const string& s);
      void remove (const string& s);
      bool empty();
      void begin();
      void end();
      bool next();
      bool prev();
      bool find(const string& s);
      const std::string& getData() const;

    private:
      class Node
      
      public:
      Node();
      Node(const string& data);
      ~Node();
      Node* next;
      Node* prev;
      string* data;
      ;
      Node* head;
      Node* tail;
      Node* current;
      ;

  void DoublyLinkedList::insertBefore(const string& s)
  
  Node* ptr = head;
  string* data = new string(s);
  if (head == NULL)
    
        append(s);
        return;
  
  if (head == current)
  
        //this is where I get an error...
        this->data= new Node();
        current->prev = head;
        current = head;
        return;

  

【问题讨论】:

为什么你首先有一个指向字符串的指针?几乎在所有情况下都是错误的 还请包括错误消息(另请参阅minimal reproducible example)。但是this->data= new Node(); 不可能是正确的,因为datastring*,而不是Node* this->data= new Node(); - 是的,正如邪恶的绵羊所说,这看起来不对。为什么你需要做this-> 来访问一个成员 - 它可能应该是:tail = new Node() 或类似的东西......如果你的错误级别提高了,你应该得到一个警告(如果你还没有) ... 这并没有解决问题,但是包含两个连续下划线 (__DOUBLYLINKEDLIST_H__) 的名称以及以下划线后跟一个大写字母的名称保留供实现使用。不要在你的代码中使用它们。 【参考方案1】:

没有理由使用指向string 的指针,这会迫使您管理内存。请改用简单的string

但这不是这里的问题。这里的局部变量与 Node 的类成员具有相同的名称,并且节点中的成员永远不会被初始化。此外DoublyLinkedList 本身没有这样的成员,所以this->data 是未知的。在这里查看我的 cmets:

void DoublyLinkedList::insertBefore(const string& s)

    ...
    string* data = new string(s);   // --> ok, but this is local variable
    if (head == NULL)
     
        append(s);     
        return;     // ouch !!!  memory leak !! data pointer is never freed
    
    if (head == current)
    
        //this is where I get an error...
        this->data= new Node();     // --> 'this' is a DoublyLinkedList, not a Node 
        ...
        return;
  

话虽如此,您是否可能混淆了DoublyLinkedList 和它包含的节点?请参阅此处开始更正,但您需要做更多的事情来处理节点之间的链接:

void DoublyLinkedList::insertBefore(const string& s)

  Node* ptr = head;
  if (head == NULL)
   
        append(s);     
        return;     
  
  if (head == current)
  
        string* data = new string(s);
        Node nd = new Node();
        nd->data = data;        // initialize node's pointer
        nd->prev = ...          // you need to link new node to the rest
        nd->next = ...  
        ...                    // and you need to update the previous and next node
        return;
  

现在,正如前面所说,将指向字符串的指针替换为字符串。至少,您将避免内存泄漏、浅拷贝和许多其他麻烦。然后你可以更好地关注链表数据结构的真正问题。

【讨论】:

以上是关于您如何使用从字符串访问信息*?的主要内容,如果未能解决你的问题,请参考以下文章

如何从脚本访问 help() 答案

如何使用 CPUID 查找主板信息?

如何使用通用访问卡连接到 HTTPS 服务器

名片解析器。如何从名片识别文本中提取相关信息?

如何使用PHP从访问者在我的网站上发表Twitter评论?

访问Azure Active Directory用户和角色