![]() |
1
23
你有构造函数的代码。
情形2:(内联构造函数)
编译器决定不需要构建构造函数(因为它将被内联)。
如果你实例化一个X类型的对象,它会再次抱怨。 情形3:(非虚拟析构函数)
构建构造函数不需要析构函数的地址。
|
![]() |
2
7
|
![]() |
3
5
在C++函数中必须 定义 如果且仅当他们是 习惯于 在您的程序中(参见3.2/2中的ODR)。一般来说,非虚函数是 习惯于 如果它们是从可能的求值表达式调用的。无条件地考虑任何非纯虚函数 习惯于 . 当[非虚拟]特殊成员函数 在语言标准的专用位置定义。等等。
|
![]() |
4
2
…很简单,你没有定义析构函数。 现在你的第二个问题更有趣了:
但如果你不加评论
为什么编译器不直接抛出
|
![]() |
5
1
这些还不是一个完整的程序(甚至不是一个完整的DLL)。当您得到错误时,您实际上得到了帮助,因为没有~X()的定义,X是不可用的 这意味着这个特定的编译器实例在某些情况下需要一个定义。即使它编译了,也什么都不做。 |
![]() |
6
1
GCC给出了下面这样的错误,这再次强烈地暗示了(至少对我来说)实现虚拟函数的非标准实现细节
|
![]() |
7
0
你可能会侥幸逃脱这一点,因为constr和dest都是私有的-如果在你的构建中没有对类X的其他引用,那么编译器可能会推断dest不是必需的,所以缺少定义也没什么大不了的。 这并没有向我解释为什么案例1失败,而2和3构建正常。想知道如果两者都被公开会发生什么? |
![]() |
Arnish Grover · 为什么这里两次调用析构函数?[副本] 7 年前 |
![]() |
hvertous · 在析构函数方法中引发异常 7 年前 |
![]() |
Phi Truong · 链表析构函数C++ 7 年前 |
![]() |
allo · C++程序挂起在向量析构函数中 7 年前 |
|
user8185371 · 释放对象的内存与终止内务管理? 7 年前 |
![]() |
Peter Hwang · 销毁列表结构的全局数组 7 年前 |