析构函数会删除内置类型和指针对象吗?
Will destructor delete built-in types and pointer objects?
我是一名 C++ 初学者,现在正在阅读 C++ 入门。我对 destrucor 有一些疑问:
第 13.1.3 章:“在析构函数中,没有类似于构造函数初始化列表的东西来控制成员的销毁方式;销毁部分是隐式的。销毁成员时会发生什么取决于成员的类型。class 类型的成员由 运行 成员自己的析构函数销毁。 内置类型没有析构函数,因此不进行任何销毁内置类型的成员."
所以如果我有这样一个 class:
class Foo {
~Foo() { delete pi; }
int *pi;
int i;
};
当Foo
的一个实例要被销毁时,根据上面的文字,内置类型变量int i
不会被销毁?那么它所属的对象已经被销毁了,它怎么存在呢
在第 13.1.4 章中:“我们在练习中使用的 HasPtr class 是一个很好的例子 (§ 13.1.1,p.499)。那个 class在其构造函数中分配动态内存。合成析构函数不会删除指针数据成员。因此,此class需要定义一个析构函数来释放内存由其构造函数分配。"
我理解合成析构函数不会释放new
已经分配的内存,并被普通指针指向,但在文中,它表明指针对象本身是也没有被合成指针删除。还是classFoo
的例子,是不是说Foo
class的一个对象销毁后,指针pi不会被销毁(所以变成无效指针) ?
规范的意思是没有代码是 运行 清理 int i
。它根本不复存在。它的内存是 Foo 的一部分,每当释放 Foo 实例时,i
就会随之而来。
对于指针也是如此,指针本身会消失(它实际上只是另一个数字),但是指针可能指向也需要释放的东西。编译器不知道是不是这样,所以你必须写一个析构函数。
这就是 std::shared_ptr
之类的东西存在的原因;它们是聪明的指针(又名 'smart'),编译器 确实 知道它是否指向需要发布的内容,并将生成正确的代码来执行此操作。这就是为什么你应该总是使用智能指针而不是 'naked' 智能指针(比如 int *p
)。
析构函数总是销毁所有成员,就像构造函数总是创建所有成员一样。你无法阻止它这样做。
according to the above text, the built in type variable int i will not be destroyed?
它将被销毁。这本书说的是,从转化为 0 条机器指令的意义上说,销毁 int
不会执行任何操作(据说是 a "no-op")。
指针也一样(不是指向的数据),所以(2)中的措辞草率,你的初步理解是正确的。
according to the above text, the built in type variable int i will not be destroyed?
它将被销毁,但没有采取任何措施来销毁它。破坏是微不足道的。
int *pi
成员变量也有基本类型,同理
Then how it will exist
它不会存在。
does that mean that after an object of Foo class is destroyed, the pointer pi will not be destroyed ( so becomes an invalid pointer )?
不是这个意思。所有子对象总是被所有合成析构函数以及所有用户定义的析构函数销毁。
删除指针和销毁指针是两个不同的事情。删除会破坏指向的对象并释放动态内存。销毁结束了指针本身的生命周期,并且是微不足道的,因为指针是基本类型。
破坏是合成的 - 以及所有其他 - 构造函数对成员所做的。综合析构函数从不删除任何指针,但示例中用户定义的 ~Foo
确实删除了成员。
虽然学习这些东西很重要,但不要在实践中使用拥有裸指针。请改用 RAII 类,例如智能指针或容器。
pi存放在栈内存中,它指向的是堆内存中的一个地址!
你需要打电话给
delete pi;
释放堆中的那部分内存
pi 本身不需要被释放
它将在其作用域后被释放。
我是一名 C++ 初学者,现在正在阅读 C++ 入门。我对 destrucor 有一些疑问:
第 13.1.3 章:“在析构函数中,没有类似于构造函数初始化列表的东西来控制成员的销毁方式;销毁部分是隐式的。销毁成员时会发生什么取决于成员的类型。class 类型的成员由 运行 成员自己的析构函数销毁。 内置类型没有析构函数,因此不进行任何销毁内置类型的成员."
所以如果我有这样一个 class:
class Foo {
~Foo() { delete pi; }
int *pi;
int i;
};
当Foo
的一个实例要被销毁时,根据上面的文字,内置类型变量int i
不会被销毁?那么它所属的对象已经被销毁了,它怎么存在呢
在第 13.1.4 章中:“我们在练习中使用的 HasPtr class 是一个很好的例子 (§ 13.1.1,p.499)。那个 class在其构造函数中分配动态内存。合成析构函数不会删除指针数据成员。因此,此class需要定义一个析构函数来释放内存由其构造函数分配。"
我理解合成析构函数不会释放
new
已经分配的内存,并被普通指针指向,但在文中,它表明指针对象本身是也没有被合成指针删除。还是classFoo
的例子,是不是说Foo
class的一个对象销毁后,指针pi不会被销毁(所以变成无效指针) ?
规范的意思是没有代码是 运行 清理 int i
。它根本不复存在。它的内存是 Foo 的一部分,每当释放 Foo 实例时,i
就会随之而来。
对于指针也是如此,指针本身会消失(它实际上只是另一个数字),但是指针可能指向也需要释放的东西。编译器不知道是不是这样,所以你必须写一个析构函数。
这就是 std::shared_ptr
之类的东西存在的原因;它们是聪明的指针(又名 'smart'),编译器 确实 知道它是否指向需要发布的内容,并将生成正确的代码来执行此操作。这就是为什么你应该总是使用智能指针而不是 'naked' 智能指针(比如 int *p
)。
析构函数总是销毁所有成员,就像构造函数总是创建所有成员一样。你无法阻止它这样做。
according to the above text, the built in type variable int i will not be destroyed?
它将被销毁。这本书说的是,从转化为 0 条机器指令的意义上说,销毁 int
不会执行任何操作(据说是 a "no-op")。
指针也一样(不是指向的数据),所以(2)中的措辞草率,你的初步理解是正确的。
according to the above text, the built in type variable int i will not be destroyed?
它将被销毁,但没有采取任何措施来销毁它。破坏是微不足道的。
int *pi
成员变量也有基本类型,同理
Then how it will exist
它不会存在。
does that mean that after an object of Foo class is destroyed, the pointer pi will not be destroyed ( so becomes an invalid pointer )?
不是这个意思。所有子对象总是被所有合成析构函数以及所有用户定义的析构函数销毁。
删除指针和销毁指针是两个不同的事情。删除会破坏指向的对象并释放动态内存。销毁结束了指针本身的生命周期,并且是微不足道的,因为指针是基本类型。
破坏是合成的 - 以及所有其他 - 构造函数对成员所做的。综合析构函数从不删除任何指针,但示例中用户定义的 ~Foo
确实删除了成员。
虽然学习这些东西很重要,但不要在实践中使用拥有裸指针。请改用 RAII 类,例如智能指针或容器。
pi存放在栈内存中,它指向的是堆内存中的一个地址! 你需要打电话给
delete pi;
释放堆中的那部分内存 pi 本身不需要被释放 它将在其作用域后被释放。