gpt4 book ai didi

c++ - 在自定义构造函数中的堆上创建指针

转载 作者:行者123 更新时间:2023-11-28 04:06:55 25 4
gpt4 key购买 nike

class Person {
public:
int *p_age;
Person(int);
};

Person::Person(int age) {
p_age = new int(age);
}

我越来越熟悉 C++ 内存管理,但我还不确定如何为自己验证在堆栈和堆上创建的内存。这是一个例子:我相信我已经在自定义构造函数的堆上创建了指针 p_age,但是在我以后遇到任何问题之前,有什么方法可以在运行时验证这种事情-是时候恢复理智了吗?

最佳答案

C++ 本身没有任何堆栈或堆的概念。这些是 C++ 实现的实现细节,但通常它们转换为标准调用的具有自动存储持续时间的对象具有动态存储持续时间的对象

从这个意义上说,您的 p_age 指向一个intnew 分配后具有动态存储持续时间(即在堆上)的对象. p_age的(指针,而不是它指向的对象)自己的存储持续时间取决于其类型为 Person 的父对象的方式。 ,它是一个子对象,被创建,例如与 Person person{42};在函数体中,personperson.p_age将具有自动存储持续时间(即它们在堆栈中),而 *(person.p_age) , person.p_age 的对象指向,仍然具有动态存储持续时间(即存在于堆上)。

无法在运行时测试指针指向的对象是否具有动态或自动存储持续时间。确保这些不会混淆是程序员的工作,例如不小心拨通了delete在指向自动存储持续时间的对象的指针上。这就是为什么你应该很少使用 new (它总是创建具有动态存储持续时间的对象),而是通过管理它的自动存储持续时间的对象封装具有动态存储持续时间的每个对象,例如使用 std::unique_ptr ,以便显式调用 delete变得不必要。

特别是在您的示例中,似乎根本没有动态分配的理由(无论是直接使用 new 还是通过 std::unique_ptr )。 “年龄”应该是“人”的一部分,即如果一个“人”被创建或销毁,那么它的“年龄”也应该如此。因此p_age应该有类型 int , 不是 int*并且应该在构造函数中简单地分配给:

Person::Person(int age) : p_age(age) {
}

它使用成员初始化列表 语法直接初始化(而不是像您的代码那样在初始化后赋值)p_ageage的值(value)。

关于c++ - 在自定义构造函数中的堆上创建指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com