代码之家  ›  专栏  ›  技术社区  ›  Pavlin

通过引用传递引用的指针时理解C++堆/堆栈分配

  •  1
  • Pavlin  · 技术社区  · 4 年前

    在这个例子中,我试图理解对象的创建和销毁会发生什么。

    #include <iostream>
    
    class Person {
    public:
        const int name;
        Person() = delete;
        Person(int& name) : name(name) {
            std::cout << "Person " << name << " created" << std::endl;
        }
        Person(const int& name) : name(name) {
            std::cout << "Person " << name << " created -- copy constructor" << std::endl;
        };
        ~Person() {
            std::cout << "Person " << name << " destroyed" << std::endl;
        }
    };
    
    class Family {
    public:
        Person mom, dad;
        Family() = delete;
        Family(Person& m, Person& d) : mom(m), dad(d) {
            std::cout << "Family created" << std::endl;
        };
        Family(const Person& m, const Person& d) : mom(m), dad(d) {
            std::cout << "Family created -- copy constructor" << std::endl;
        };
        ~Family() {
            std::cout << "Family destroyed" << std::endl;
        }
    };
    
    int main()
    {
        Person* m = new Person(1);
        Person* d = new Person(2);
        Family f(*m, *d);
    
        return 0;
    }
    

    这个输出

    Person 1 created -- copy constructor                                                                                                    
    Person 2 created -- copy constructor                                                                                                    
    Family created                                                                                                                          
    Family destroyed                                                                                                                        
    Person 2 destroyed                                                                                                                      
    Person 1 destroyed
    

    new 关键字随后应该是 delete Person& m 我参考了一下没有 & ,就像 Person m ,那么 m 会被复制到这里(在堆栈上),我会有内存泄漏,因为堆被分配 new Person("Jane") 不会被删除。

    但是,既然我是参考它,我是否仍然有内存泄漏?两者兼而有之 d 调用了它们的析构函数,但这是否也释放了堆内存?我怎么能想到 Family.dad ? 这是堆栈变量吗?如果是这样,那么就是整个 Family

    删除 Person 物体?

    1 回复  |  直到 4 年前
        1
  •  5
  •   Igor R.    4 年前

    添加复制构造函数以查看全局。

    Family::Family 通过引用获取对象,然后将它们复制到成员中 mom dad

    至于 Person 使用创建的实例 new 它们按照“C++”标准在“免费商店”中分配。通常,这意味着它们驻留在堆上。

    奥托, Family