指向对象和析构函数的指针

Pointer to object and destructor

我想了解为什么我的代码不使用 class 名称的析构函数。事实上我写了两个 classes。第一个称为 Name,第二个称为 Person,它们具有指向对象 Name 的指针。我不明白的是为什么程序没有调用 Name 的析构函数,因为我认为当我写“new”时我创建了一个新对象所以它必须调用 class Name 的析构函数关闭程序。

你能解释一下我的理解有什么问题吗?谢谢!

class Name
{
private:
    string name;
public:
    Name(string name) : name(name) { cout << "Hello " << name << endl; }
    ~Name() { cout << "See you soon " << name; }
};
class Person
{
private:
    Name* myname;
public:
    Person(string name) { myname = new Name(name); }
    ~Person() { cout << "Exit" << endl; }
};

int main()
{
    Person("Marc");
    Person("Alex");
}

As myname Person class 中的对象是一个指针。对于每个指针,都必须有一个 delete 语句来释放内存。

将 Person 的 class 析构函数替换为:

~Person() { 
        cout << "Exit" << endl;
        delete myname;
    }

您在此处创建了内存泄漏,因为您在此处创建了 Name 的新实例

Person(string name) { myname = new Name(name); }

但你永远不会删除它。这就是为什么永远不会调用 Name 的析构函数的原因。

为避免这种情况,您可以使用 std::unique_ptrstd::shared_ptr,它们将自动处理此类对象的生命周期。

std::unique_ptr<Name> myname;
Person(string name) { myname = std::make_unique<Name>(name); }

另一种方法是在析构函数中删除对象,但在 C++ 中,您应该避免直接处理动态原始指针。

#include <iostream>
#include <memory>

class Name
{
private:
    std::string name;

public:
    Name(std::string name) : name(name) { std::cout << "Hello " << name << std::endl; }
    ~Name() { std::cout << "See you soon " << name << std::endl; }
};
class Person
{
private:
    std::unique_ptr<Name> myname;

public:
    Person(std::string name) { myname = std::make_unique<Name>(name); }
    ~Person() { std::cout << "Exit" << std::endl; }
};

int main(int argc, char **argv)
{
    Person("Marc");
    Person("Alex");

    return 0;
}