【ThinkingInC++】65、使用delete void*可能会出错

/**
* 书本:【ThinkingInC++】
* 功能:使用delete void*可能会出错
* 时间:2014年10月5日14:31:43
* 作者:cutter_point
*/

#include <iostream>

using namespace std;

class Object
{
    void* data; //一个void*类型的指针
    const int size;
    const char id;
public:
    Object(int sz, char c) : size(sz), id(c)
    {
        data=new char[size];
        cout<<"创建一个类 "<<id<<", size = "<<size<<endl;
    }
    //析构函数,输出一段话表示执行了析构函数,然后析构data数组
    ~Object() {cout<<"析构这个类 "<<id<<endl; delete [] data;}
};

int main()
{
    Object* a=new Object(40, 'a');
    delete a;
    void* b=new Object(40, 'b');
    delete b;   //显示地结果是b没有调用析构函数
    //由于不知道b的类型是什么,那么程序执行的结果是吧b的对象内存回收了,但是
    //类里面的data指向的类容没有被析构,

    return 0;
}

时间: 2024-10-14 00:53:50

【ThinkingInC++】65、使用delete void*可能会出错的相关文章

微信SDK导入报错 Undefined symbols for architecture i386:&quot;operator delete[](void*)&quot;, referenced from:

异常信息: Undefined symbols for architecture i386:  "operator delete[](void*)", referenced from:      +[WeChatApiUtil EncodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)      +[WeChatApiUtil NsDataEncodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)    

C++ 编程思想(第一卷)阅读总结

最近工作闲翻阅了之前买f<C++编程思想>这里贴上我认为对我最有帮助的部分,一来留给自己复习看,另一方面也和小伙伴们分享下: 1 OPP相关 1.1.每个对象都有一个类型,OOP中class 和type是同义词,在面向对象的程序设计中,我们所做的工作实际上就是创造新的数据类型,程序员定义class 是为了与具体问题相适应,而不是被迫适用已存在的数据类型. 1.2.当用<>来指定文件时,预处理器以特定的方式来寻找文件,一般是环境中或者编译器命令指定的某种寻找路径:当采用"&

【ThinkingInC++】64、重载new和delete,来模仿内存的分配

/** * 书本:[ThinkingInC++] * 功能:重载new和delete,来模仿内存的分配 * 时间:2014年10月5日14:30:11 * 作者:cutter_point */ #include <cstddef> //size_t这个类型的使用 #include <fstream> #include <iostream> #include <new> using namespace std; ofstream out("Frami

动态对象创建(二)重载new和delete

前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常我们为了一些目的而使用new和delete的内存分配系统,但是在特殊情况下,它并不能够满足需要.最常见的改变分配系统的原因是出于效率考虑:也许要创建和销毁一个特定的类的非常多的对象以至于这个运算变成了速度的瓶颈.C++允许重载new和delete来实现我们自己的存储分配方案,所以可以用它来处理问题. 另一个问题就是堆碎片:分配不同大小的内存可

【ThinkingInC++】69、异常处理

第一章 异常处理 1.5清理 1.5.1 资源管理 如果一个对象的构造函数在执行过程中抛出异常,那么这个对象的析构函数就不会被调用. Rawp.cpp /** * 书本:[ThinkingInC++] * 功能:资源管理 * 时间:2014年10月8日20:19:03 * 作者:cutter_point */ #include <iostream> #include <cstddef> using namespace std; class Cat { public: Cat() {

29.局部和全局重载new delete

1 #include <iostream> 2 #include <Windows.h> 3 using namespace std; 4 5 //全局内存管理,统计释放内存,分配内存 6 7 //重载全局的new 8 void *operator new(size_t size) 9 { 10 cout << "g_new call" << endl; 11 void *p = malloc(size); 12 return p; 13

C++中的new/delete与operator new/operator delete

new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载 operator new(1)只分配所要求的空间,不调用相关对象的构造函数.当无法满足所要求分配的空间时,则        ->如果有new_handler,则调用new_handler,否则        ->如果没要求不

重载类的new和delete运算符成员函数

重载类的new和delete运算符成员函数1. 调用new时,先分配内存,后调用构造函数.调用构造函数的行为由编译器控制.2. 调用delete时,先调用析构函数,后释放内存.调用析构函数的行为由编译器控制.重载这两个运算符函数的目的是为了控制内存的分配与释放.如果需要对某个类型频繁地创建和销毁大量的对象,new和delete运算过程可能会耗费过多的时间,并且会产生过多的内存碎片.这两个运算符函数的原型:void * operator new(size_t sz);void operator d

C++中的new与delete(二)

C++一个对象构造的完整过程为:分配内存和初始化,这也是new关键字所实现的功能,分配内存可通过重载new操作符来实现,系统初始化可通过调用构造函数来完成.我们不能改变new关键字的功能,但可以改变分配内存的方式. new操作符的重载 new操作符的重载默认有一个分配内存大小的形参,但可根据实际需要来增加新的参数. void* operator new(size_t size) { cout << "A::new()" << endl; return mallo