为什么带有用户定义析构函数的类的实例将成员指针设置为零
Why instance of class with user defined destructor has member pointer set to zero?
为什么带有自定义析构函数的类的实例成员指针设置为零,而没有自定义析构函数的类不设置默认指针值?
#include <stdio.h>
struct A
{
int *p;
~A(){};
};
struct B
{
int *p;
};
int main()
{
A a;
printf("a.p=%pn", a.p);
B b;
printf("b.p=%pn", b.p);
}
输出为:
a.p=00000000
b.p=7667ADF9
值未定义。巧合的是,a
是零。
您正在获得堆栈上的值,并且纯粹偶然地,第一个变量a的内部值在运行main的代码中始终为0x00000000的值上。但是,这完全依赖于代码的实现,它是没有定义的,当然也不具有可移植性。正确的做法是在构造函数中或通过默认初始化将指针初始化为已定义的值。
回答你的问题:没有区别,你观察到的是副作用。如果您从A
中删除析构函数并在B
中添加一个析构函数,则值不会改变。(即a.p
仍为0)
没有。指针的值未指定。如果你看到的是零,那么这只是纯粹的机会。
请注意,读取这个未初始化的值实际上具有未定义的行为,因此您可以在左眼皮后面看到超新星形式,而不是看到任何数字。
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制