std::unique_ptr of base class holding reference of derived class 在 gcc 编译器中不显示警告,而裸指针显示警告。为什么?
std::unique_ptr of base class holding reference of derived class does not show warning in gcc compiler while naked pointer shows it. Why?
我有一个基础层级 class 和派生层级 class。基 class 有一个虚函数,它被派生 class 覆盖。
class Base
{
public:
~Base();
virtual void other_functionality() = 0;
};
class Derived : public Base
{
public:
~Derived ();
void other_functionality() {//some code};
};
现在如果我这样做:
int main()
{
Base * P = new Derived ();
delete p;
return 0;
}
它给出错误:
正在删除具有非虚拟析构函数的多态 class 类型的对象。
但是 unique_ptr 它会在没有警告的情况下通过。
int main()
{
std::unique_ptr<Base> p;
p.reset(new Derived ());
return 0;
}
我知道我是否使用虚拟析构函数。用裸指针警告将被解决。但问题仍然存在 - 为什么没有虚拟析构函数显示裸指针有问题而不是 unique_ptr.
嗯,首先,当基 class 没有虚析构函数时,通过基指针删除派生对象是未定义的行为。编译器不需要诊断未定义的行为......
也就是说,使用std::unique_ptr
时没有出现这个警告的原因很可能是因为GCC does not report warnings that would appear in system headers.
我找不到 link,但我确实在 GCC 错误数据库中看到了对此的在线讨论。
警告是针对实际的 delete
表达式发出的。在 unique_ptr
的情况下,delete
在系统头文件中被调用。
根据该错误报告中的讨论,实施 C++ 系统库需要进行各种妥协,从而导致各种警告。因此,警告被限制在系统头文件中。这就是您不会看到预期警告的原因。
更新:这是直接来自马口的:
https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html
The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.
我有一个基础层级 class 和派生层级 class。基 class 有一个虚函数,它被派生 class 覆盖。
class Base
{
public:
~Base();
virtual void other_functionality() = 0;
};
class Derived : public Base
{
public:
~Derived ();
void other_functionality() {//some code};
};
现在如果我这样做:
int main()
{
Base * P = new Derived ();
delete p;
return 0;
}
它给出错误:
正在删除具有非虚拟析构函数的多态 class 类型的对象。
但是 unique_ptr 它会在没有警告的情况下通过。
int main()
{
std::unique_ptr<Base> p;
p.reset(new Derived ());
return 0;
}
我知道我是否使用虚拟析构函数。用裸指针警告将被解决。但问题仍然存在 - 为什么没有虚拟析构函数显示裸指针有问题而不是 unique_ptr.
嗯,首先,当基 class 没有虚析构函数时,通过基指针删除派生对象是未定义的行为。编译器不需要诊断未定义的行为......
也就是说,使用std::unique_ptr
时没有出现这个警告的原因很可能是因为GCC does not report warnings that would appear in system headers.
我找不到 link,但我确实在 GCC 错误数据库中看到了对此的在线讨论。
警告是针对实际的 delete
表达式发出的。在 unique_ptr
的情况下,delete
在系统头文件中被调用。
根据该错误报告中的讨论,实施 C++ 系统库需要进行各种妥协,从而导致各种警告。因此,警告被限制在系统头文件中。这就是您不会看到预期警告的原因。
更新:这是直接来自马口的:
https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html
The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.