指针复制到另一个指针时的工作方式

时间:2019-03-01 04:32:40

标签: c++ pointers delete-operator

大家好。

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

    int main() 
    { 

        int* ptr1 = new int; 

        int* ptr2 = ptr1; 

        delete ptr2; // Detroying ptr2 

        return 0; 
    } 

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

这部分

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;
}

对于第二个问题,您不删除指针,而是删除它们指向的内存。如果以后的节点有您要释放的内存,那么可以,您将必须递归删除这些内存