delete void*

delete void* 对于一些简单的系统内建类型不会有问题,但是对于C++的类,确实存在一个问题,因为这样不会调用析构函数,因为类型已经丢失,如果类里面存在一个指针类型,指向了另一块内存,可能使得这块内存泄露。而类本身占据的内存不会泄露,举个例子:

‍include <iostream>

classTest {
   void*data;
   intn;
public:
    Test(intm) : n(m) {
       data=newint[n];
    std::cout<<"Creat Object , Size ="<<n<<std::endl;
   }
   ~Test() {
    std::cout<<"delete Object"<<std::endl;
    delete []data;//OK, just releases storage, no destructor calls ara necessary
   }
};

int main()
{
    Test*test_1=newTest(10);
    std::cout<<(void*)test_1<<std::endl;
    delete test_1;
   void*test_2=newTest(12);
    std::cout<<(void*)test_2<<std::endl;
    delete test_2;//
   //Test* t = new(test_2) Test(13);
    Test*t=newTest(13);//在delete test_2之后,new一块内存,打印的内存地址和刚才test_2的一样(证明内存释放了)
//但是如果Test类里面有char* p;之类的指针成员,指向了另外的内存,释放工作在析构函数完成,那么,由于上述的detele没有调用析构函数,造成泄露!
    std::cout<<(void*)t<<std::endl;
    delete t;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值