【问题标题】:Pointers how it works when copied to another pointer指针复制到另一个指针时如何工作
【发布时间】:2019-03-01 04:32:40
【问题描述】:

大家好。

#include <bits/stdc++.h> 
    using namespace std; 

    int main() 
    { 

        int* ptr1 = new int; 

        int* ptr2 = ptr1; 

        delete ptr2; // Detroying ptr2 

        return 0; 
    } 

在上述情况下,ptr1 使用的内存将被释放,或者只是 ptr2 将被销毁。 我还有一个疑问。我有一种树型结构,其中节点指向两个孩子(这些孩子有叶节点,考虑它是一棵大树)。如果我必须删除根节点的一个子节点,我是否需要删除grand children、grand grand children 等的每个指针对象? 先谢谢了?

【问题讨论】:

    标签: c++ pointers delete-operator


    【解决方案1】:

    ptr2 和 ptr1 指向的 int 将被释放。删除操作符释放指针指向的对象,而不是指针本身。 (删除后指针仍然存在,但它们现在是“悬空指针”,指向不再使用的内存)

    至于删除树结构,是的,您需要递归删除,直至叶子。通常这是在你的节点类的析构方法中完成的,并且非常容易(只需在每个直接子节点上调用 delete,这将导致它们的析构方法执行并删除它们的每个子节点,依此类推)

    【讨论】:

      【解决方案2】:

      这部分

      new int;
      

      正在为 int 分配内存,这将在以后被删除。该内存的位置是指针的值。您可以让任意数量的指针指向该内存,所有指针都将具有相同的值。当该内存被删除时,指针的值仍然相同,您只是不应该取消引用指针,因为它们现在指向已删除的内存

      #include <iostream>
      
      int main() {
          int* ptr1 = new int;
          int* ptr2 = ptr1;
      
          // When I ran this the output was: 0x7fe835402a40 0x7fe835402a40
          std::cout << ptr1 << ' ' << ptr2 << std::endl;
      
          delete ptr1;
      
          // Output is still: 0x7fe835402a40 0x7fe835402a40
          std::cout << ptr1 << ' ' << ptr2 << std::endl;
      
          return 0;
      }
      

      至于您的第二个问题,您不删除指针,而是删除了它们指向的内存。如果后面的节点有你想释放的内存,那么是的,你将不得不递归地删除那些

      【讨论】:

        猜你喜欢
        • 2019-09-27
        • 2021-02-07
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        相关资源
        最近更新 更多