如何解决指向对象和析构函数的指针
我试图理解为什么我的代码不使用类名称的析构函数。实际上我写了两个类。第一个称为 Name,第二个称为 Person,它们有一个指向对象 Name 的指针。我不明白的是为什么程序不调用 Name 的析构函数,因为我认为当我写“new”时我创建了一个新对象,所以它必须在关闭程序之前调用类 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");
}
解决方法
您在此处创建了内存泄漏,因为您在此处创建了 Name
的新实例
Person(string name) { myname = new Name(name); }
但你永远不会删除它。这就是从不调用 Name
的析构函数的原因。
为避免这种情况,您可以使用 std::unique_ptr
或 std::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;
}
,
As myname 在 Person 类中的对象是一个指针。对于每个指针,必须有一个删除语句来释放内存。
将 Person 的类析构函数替换为:
~Person() {
cout << "Exit" << endl;
delete myname;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。