delete incomplete type

C++ 不完整类型与 delete
探讨C++中不完整类型指针删除的未定义行为,及如何避免编译时错误。通过实例说明分离编译下,delete操作可能导致的问题。
前言

因为c++ 可以定义 不完整类型的指针或者引用,那么当我们delete 不完整类型指针的时候会发生未定义行为,一般只会释放调相应内存不会调相应的析构函数。

场景

因为c++ 是分离编译,所以可能某个源文件进行了delete 不完整类型,这个时候编译器也不会从后面的依赖文件寻找具体的析构函数,所以这个时候就会发生未定义行为就像下面的列子,这个时候就坑了

test.cc 
class A;
void  Fun(A* p) 
{
   delete p;
}
main.cc 
class A{
};
void Fun(A*p);
 int main () {
    A* p ;
    Fun(p);
    return 0;
}
g++ test.cc main.cc 
check 不完整类型

下面这个表达式三段理解

  1. sizeof(T) 不完整类型应该报错
  2. 如果 1 不报错, 那么表达式变为 char [-1] ,这个时候声明一个负数数组应当报错
  3. 如果这个时候不报错,那么 sizeof ( char[-1]) ,求一个 char[-1] 类型的大小,这个时候会最终报错
typedef char must_complete_type[ (sizeof(T)) ? 1 : -1];
(void) sizeof(must_complete_type);
参考

https://social.msdn.microsoft.com/Forums/vstudio/en-US/cb018b2a-4e80-41ed-b3ff-6d4ba9562463/how-does-the-function-work-and-why?forum=vcgeneral

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值