指向对象和析构函数的指针
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_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;
}
我想了解为什么我的代码不使用 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_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;
}