不要轻易delete void*指针,这样会隐藏比较多的错误。
#include<iostream>
using namespace std; class Object{
void* data;
const int size;
const char id;
public:
Object(int sz, char c) :size(sz),id(c){
data = new char[size];
cout << "Constructor Object" << id << ",size=" << size << endl;
}
~Object(){
cout << "Destructing object" << id << endl;
delete[]data;
} }; int main(){
Object* a = new Object(,'a');
delete a;
void* b = new Object(,'b');//会调用构造函数
delete b;//不会调用析构函数 return 0; }

首先我们来开一下这个类的内存模型。

在运行结果截图中,我们看到
Object* a = new Object(40,'a');
delete a;
可以正确的构造对象,在析构函数中也可以把用delete把data指针指向的内存释放掉。(在对void*类型的内存使用delete,并不会发生错误,仅仅是把内存释放掉。)但是在main函数中,我们看到delete知道它所操作的对象的类型是十分重要的。我们看到
void* b = new Object(41,'b');//会调用构造函数
delete b;//不会调用析构函数
在用delete删除b的操作中,我们只是对b指向的对象进行了释放,并没有调用构造函数,也就是说data指向的内存并没有被释放,而此时又没有指针指向刚才data指针指向的内存,从而造成了内存的丢失,更会造成内存的泄露。 这会有一个比较有意思的地方就是如果写下面的代码,
Object* pc=(Object*)malloc(sizeof(Object));//这个事情我们在new delete运算符与malloc free库函数的区别中讲到过,这时候不会调用构造函数,只会分配内存
delete pc;//而这句话因为pc是有类型的,不是void*所以会调用析构函数
不要轻易delete void*指针,这样会隐藏比较多的错误。的更多相关文章
- C++学习笔记(十一):void*指针、类型转换和动态内存分配
void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void ...
- 【ThinkingInC++】65、使用delete void*可能会出错
/** * 书本:[ThinkingInC++] * 功能:使用delete void*可能会出错 * 时间:2014年10月5日14:31:43 * 作者:cutter_point */ #incl ...
- free 或delete后指针怎么样了
free()和delete()只是把指针所指向的内存释放掉,但是并没有把指针本身删除,也没有把指针置为NULL; #include<iostream> using namespace st ...
- delete void *
看代码的时候看到 typedef char xxx[sizeof(T) ? 1 : -1]; 这种语句 如:JavaScriptCore/wtf/OwnPtrCommon.h template < ...
- C++(二十二) — 指针变量、函数指针、void指针
1.指针变量 (1)指针变量必须在初始化后才可以正常使用,初始化就是给他分配一个有效的数据地址. 先初始化,后使用. (2)指针可以进行加减运算,++ 或者 --:将指针的位置向前或者向后移动一个数据 ...
- 指针版的PStash(用一个void指针数组, 来保存存入元素的地址) 附模板化实现 p321
由容器PStash的使用者,负责清除容器中的所有指针.所以用户必须记住放到容器中的是什么类型,在取出时,把取出的void指针转换成对应的类型指针,然后 'delete 转换后的对象指针',才能在清除时 ...
- 你必须知道的指针基础-7.void指针与函数指针
一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...
- (七)C语言中的void 和void 指针类型
许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...
- C/C++语言void及void指针深层探索(转)
转自:http://www.lanou3g.com/blog/sort/SelfiOS/page/78 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一 ...
随机推荐
- volley_之2
一开始会不会觉得有点怔,为什么只需要将请求添加到队列中,不需要去发送请求吗?当然是要的,只是这一切都被封装在Volley后面而已. 我们先来看一下隐藏在Volley后面的这个架构是怎么样的吧,如下图: ...
- Spark往Elasticsearch读写数据
def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setAppName("DecisionTre ...
- Python招聘需求与技能体系
目前国内的招聘Python,基本都是偏向web后台开发,偶有高大上的数据挖掘&机器学习. 这是之前(2012年)找工作整理的一些JD,在梳理几年来的笔记,顺带理一理 可以以此建立自己的技能体系 ...
- hihocoder 1391 [扫描线]
/* 题意: 两方对阵,互发导弹.防护罩可以让导弹原速反向. 每一枚导弹有发射时间航行时间伤害值. 防护罩也有开启时间和防御时间. 其中一方防护罩开启时间已知,求另一方防护罩合理安排开启时间使得己方受 ...
- Show "Appear Offline" in Lync
在注册表中 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Communicator 创建DWORD,name是EnableAppearOffline,v ...
- 元素JS拖动的实现
涉及到了几个位置的属性 offset clientX cilentY 等 $(selector).on("mousedown",function (e){ var x = e. ...
- dispay属性的block,inline,inline-block
转自下面的几位大神: http://www.cnblogs.com/KeithWang/p/3139517.html 总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 bl ...
- jQuery MD5加密实现代码
$(md("你想要加密的字符串")); md5插件下载地址:http://xiazai.jb51.net/201003/yuanma/jquery_md5.rar 下面是我的简单例 ...
- MySQL的表的优化和列类型的选择
列选择原则: 1:字段类型优先级 整型 > date,time > enum,char>varchar > blob 列的特点分析: 整型: 定长,没有国家/地区之分,没有 ...
- C++基于TCP和UDP的socket通信
以下是关于socket编程的一个非常经典的例子: 服务端: #include <stdio.h> #include <Winsock2.h> //windows socket的 ...