通过指针C++调用成员函数,对象为空?

Posted

技术标签:

【中文标题】通过指针C++调用成员函数,对象为空?【英文标题】:Calling member function via pointer C++, object is null? 【发布时间】:2021-06-14 20:25:02 【问题描述】:

我有一个指向 ListNode 对象sum_ptr 的指针,它指向sum。当我通过sum_ptr 调用append 方法时,我得到一个段错误。查看gdb,我看到“this”在追加调用中是0x0,这没有意义。有谁知道为什么 sum 对象在调用 append 方法时为空?谢谢!

  ListNode sum;
  ListNode* sum_ptr = ∑
  
  const ListNode* l1_ptr = &l1;
  const ListNode* l2_ptr = &l2;

  int c_over = 0;
  while(l1_ptr != nullptr && l2_ptr != nullptr)
    int temp_sum = l1_ptr->val + l2_ptr->val + c_over;
    temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum;
    c_over = temp_sum >= 10 ? 1 : 0;

    sum_ptr->append(temp_sum);
    sum_ptr = sum_ptr->next;
    
    l1_ptr = l1_ptr->next;
    l2_ptr = l2_ptr->next;
  

追加方法:

void ListNode::append(int v)
  if(this->val == INT_MIN)
    this->val = v;
  
  else
    ListNode *e = new ListNode();
    e->val = v; 
    ListNode* n = this;
    while(n->next != nullptr)
      n = n->next;
    
    n->next = e;
  

【问题讨论】:

sum_ptr->append(temp_sum); sum_ptr = sum_ptr->next;之后,你永远不会检查sum_ptr是否为空。 @ianwt 在此语句之后 temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum; temp_sum 小于 10。所以下一条语句 c_over = temp_sum >= 10 ? 1:0;没有意义。 @ianwt 还有这个条件 if(this->val == INT_MIN) this->val = v; 没有意义。 【参考方案1】:

问题的原因如下。

您使用默认构造函数声明了一个节点。

ListNode sum;

似乎默认构造函数将数据成员 next 设置为 nullptr 并将数据成员 val 设置为值 INT_MIN(这没有意义)。

那么你第一次使用指针sum_ptr调用成员函数append

ListNode* sum_ptr = ∑
//...
sum_ptr->append(temp_sum); 

本例中的成员函数append只是改变了数据成员val

void ListNode::append(int v)
  if(this->val == INT_MIN)
    this->val = v;
  
  //...

然后你在 while 循环中重新分配指针

sum_ptr = sum_ptr->next;

所以现在指针sum_ptr 的数据成员sum.next 的值等于nullptr。而且您在成员函数append 的下一次调用中使用了这个空指针,这会导致未定义的行为。

还要注意例如这对语句

temp_sum = temp_sum >= 10 ? temp_sum - 10 : temp_sum;
c_over = temp_sum >= 10 ? 1 : 0;

没有意义,因为在执行第一条语句后temp_sum总是小于10。所以变量c_over总是会设置为0。你至少需要交换这些语句。

【讨论】:

我的问题是我的类没有空链表的概念,所以我的方法是默认初始化为 INT_MIN 以表示空链表。我想出了一个更好的方法,即为我的 ListNode 创建一个包装类,它将有一个默认初始化为 nullptr 的头数据成员。这表示一个空列表。感谢您的帮助!

以上是关于通过指针C++调用成员函数,对象为空?的主要内容,如果未能解决你的问题,请参考以下文章

C++ this详解

C++ Primer 5th笔记(chap 19 特殊工具与技术)将成员函数用作可调用对象

c++类的成员函数指针如何转为普通指针

C++ this 指针

C++之静态

C++类和对象(this指针6个默认成员函数const成员)