
[英]Can I new[], then cast the pointer, then delete[] safely with built-in types in C++?
[英]Will destructor delete built-in types and pointer objects?
我是 C++ 初学者,现在正在阅读 C++ Primer。 我对析构函数有一些问题:
在第 13.1.3 章中:“在析构函数中,没有类似于构造函数初始化器列表来控制成员的销毁方式;销毁部分是隐式的。成员被销毁时会发生什么取决于成员的类型。类类型通过运行成员自己的析构函数来销毁。内置类型没有析构函数,因此没有任何操作来销毁内置类型的成员。”
所以如果我有这样的课:
class Foo {
~Foo() { delete pi; }
int *pi;
int i;
};
当Foo
的一个实例要被销毁时,根据上面的文字,内置的类型变量int i
不会被销毁吗? 那么在它所属的对象被销毁后,它将如何存在。
在第 13.1.4 章:“我们在练习中使用的 HasPtr 类就是一个很好的例子(§ 13.1.1, p.499)。该类在其构造函数中分配动态内存。合成的析构函数不会删除数据成员那是一个指针。因此,这个类需要定义一个析构函数来释放其构造函数分配的内存。
我理解合成的析构函数不会释放已经被new
分配并由普通指针指向的内存,但是在本文中,它表明指针对象本身也没有被合成指针删除。 还是Foo
类的例子,是不是意味着Foo
类的对象被销毁后,指针 pi 不会被销毁(所以变成无效指针)?
规范的意思是没有运行代码来清理
int i<\/code> 。
它只是不复存在。
它的内存是 Foo 的一部分,每当释放一个 Foo 实例时,
i<\/code>都会使用它。
对于指针也是如此,指针本身将简单地消失(它实际上只是另一个数字),但<\/em>指针可能指向也需要释放的东西。 编译器不知道是否是这种情况,因此您必须编写析构函数。
这就是存在
std::shared_ptr<\/code>之类的东西的原因,它们是聪明的指针(又名“智能”),编译器确实知道它是否指向需要释放的东西,并会生成正确的代码来执行此操作。
这就是为什么您应该始终使用智能指针而不是“裸”指针(如
int *p<\/code> )
析构函数总是销毁所有成员,就像构造函数总是创建所有成员一样。 你不能阻止它这样做。
根据上面的文字,内置类型变量 int i 不会被破坏吗?
它将被摧毁。
这本书说的是销毁一个
int<\/code>不会执行任何操作(据说它
是“无操作”<\/a> ),因为它转换为 0 个机器指令。
指针(不是它们指向的数据)也是如此,因此(2)中的措辞草率,您最初的理解是正确的。
根据上面的文字,内置类型变量 int i 不会被破坏吗?
<\/blockquote>它将被摧毁,但没有采取任何措施来摧毁它。 破坏是微不足道的。
int *pi<\/code>成员变量也有一个基本类型,同样适用于它。
那么它将如何存在
它不会存在。
这是否意味着在 Foo 类的对象被销毁后,指针 pi 将不会被销毁(因此成为无效指针)?
这并不意味着。 所有子对象总是被所有合成的析构函数以及所有用户定义的析构函数销毁。
删除指针和销毁指针是两件不同的事情。 删除会破坏指向的对象并释放动态内存。 销毁结束了指针本身的生命周期,并且是微不足道的,因为指针是基本类型。
破坏是合成的 - 以及所有其他 - 构造函数对成员所做的事情。
合成的析构函数从不删除任何指针,但示例中用户定义的
~Foo<\/code>确实删除了该成员。
尽管学习这些东西很重要,但在实践中不要使用拥有裸指针。 请改用智能指针或容器等 RAII 类。
pi 存储在堆栈内存中,它指向堆内存中的地址! 你需要打电话
delete pi;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.