对 malloc free ,new,delete 的思考与探索——1

/**********************************************************************
* *   Copyright (c)2015,WK Studios
* *   Filename:  A.h
* *   Compiler: GCC  vc 6.0
* *   Author:WK
* *   Time: 2015 25 7
* *********************************************************************
#include<iostream>
using namespace std;

/*
//malloc 和free函数,new之中内置了sizeof 类型转换,和类型安全检查对于非内部类型对象来说动态创建对象的同时完成了初始化
void* malloc(size_t size)//这里是字节的个数
{

}
void free(void *memblock)//指针的类型和所指内存中的容量事先已经知道,对于NULL指针可以释放无数次,对于非NULL的指针只能释放一次
{                         //free()并没有将指针的内容释放变为随机值,而是将指针中存储的地址所对应的那块内存释放变为随机值,所以此时不能访问那块内存中的数据,但是你可以通过指针找到那块内存,只是读取其中的内容是非法的

}
//plain new/delete,标准C/C++中申请失败时候会抛出标准异常,所以必须在使用的时候设置异常处理器
void* operator new(size_t lenth)throw(std::bad_alloc)
{

}
void operator delete(void* memblock)throw()
{

}

//nothrow new/delete,申请失败的时候返回NULL,使用的时候不需要设置异常处理器
void* operator new(size_t lenth,const std::nothrow_t &ex)throw()
{

}

void operator delete(void* memblock)throw();

//placement new/delete
void* _operator new(size_t void* mem)
{

}

  void _operator delete(void* mem,void* bloc)
  {

  }
*/

//nothrow new/delete使用
void func(size_t lenth)
{
	unsigned char *p = new(nothrow) unsigned char[lenth];
	if(p == NULL)
	{
		cout<<"allocate failed!!\n";
		exit(-1);
	}
	delete []p;
}

//plain new/delete使用
char * GetMemory(unsigned long   lenth)
{
	char *p = new char[lenth];
	return p;
}

class base
{
public:
	base(int a=0):m_a(a)
	{

	}
	~base()
	{

	}
private:
	int m_a;
};

void main()
{

//malloc free的使用
	long *buffer;
	long *buffer1;
	buffer1=(long *)malloc(40*sizeof( long ) );//空间随机值
	if( buffer1 != NULL )
		printf( "Allocated 40 long integers\n" );
	else
		printf( "Can't allocate memory\n" );

	buffer = (long *)calloc( 40, sizeof( long ) );//空间全部置0
	if( buffer != NULL )
		printf( "Allocated 40 long integers\n" );
	else
		printf( "Can't allocate memory\n" );
	free( buffer );
		free( buffer1 );
	try
	{
      char *p = GetMemory(100000000);
	  delete []p;
	}
	catch(const std::bad_alloc& ex)
	{
		cout<<ex.what()<<endl;

	}
	catch(...)
	{
		cout<<"ERROR!!!\n";
	}  

	func(100);
//placement new  允许在已经成功分配的内存上边重新构造对象或者对象数组,根本不用担心内存分配失败,因为定位New并没有分配内存只是调用了构造函数创建对象
	char*p = new(nothrow)char[sizeof(base)];//nothrow new
	if(p == NULL)
	{
		cout<<"allocate failed!!\n";
		exit(-1);
	}

	base *q = new(p) base(1000);//placement new
    q->~base();//要显示的调用析构函数
	delete []p;

char *pb = new(nothrow) char[sizeof(int)*10];
if(pb == NULL)
{
	cout<<"allocate failed!!\n";
	exit(-1);
}
int *qb = new(pb) int(10);
delete []pb;

//多次delete或者free一个NULL指针没有危险,因为delete会首先检查这种情况,指针为NULL,直接返回,但是非NULL的指针只能delete或者free一次

int *pa = NULL;
free(p);
free(p);
delete(p);
delete(p);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 19:33:10

对 malloc free ,new,delete 的思考与探索——1的相关文章

malloc/free&amp;&amp;new/delete

malloc 原型:extern void* malloc(unsigned int num_bytes); 头文件:#include<stdlib.h> 返回值: 返回void*指针,因此必要时需要进行类型转换 备注:void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...) 工作机制: malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链

使用.NET进行高效率互联网敏捷开发的思考和探索【一、概述】

不知从什么时候开始,创业变得很廉价,谈什么都是互联网,动辄融资千万.这阵风好像也刮向了程序员中,有那么一大批开发者,数据结构不好好学习.数据库原理不扎实掌握,在github上发布几个项目,用nodejs创建一些服务,再用H5写出APP,就自以为迈入了高级程序员的队伍,能够运筹帷幄互联网项目,难道学习新技术.新理念就是快速成长吗,显然不完全是,在这浮躁的氛围中,各种粗制滥造的互联网网站.APP接踵而至,很多看似漂亮的APP,连简单的http接口安全都没有措施应对,很多美丽的响应式网站,目录结构随意

关于Web前端开发的思考和探索

一.引言 首先这些年关于前端技术层出不穷,从最早的只用js做简单验证,到现在发现好像大前端已经无所不能了的感觉.特别是为了降低前端开发复杂度,涌现了一大批的MVC/MVVM模式的前端框架,不停了刷新我们的代码组织结构及开发模式,比如:BackboneJS.EmberJS.KnockoutJS.AvalonJS(国产).AngularJS.ReactJS等等. 二.现有主流框架 我们的开发模式第一次革命应该算是从google提出ajax一直到nodejs变化是非常的大,我们也在尝试着找到更合理更简

容器云平台在传统企业落地的一些思考和探索

本文内容是我今天在一个云原生论坛上演讲的材料,加上一些备注,现在分享给大家. 从应用的承载和部署方式这一角度看,一共经历了传统的物理机架构.虚拟化架构.和现在的容器化三种架构.但是,容器并不是一种虚拟化技术,它与虚拟机有实质性区别. 虽然把云分为IaaS.PaaS 和 SaaS 已经好多年了,但是,它们只有的差别,一直是想得出但摸不到.对我个人来说,只有在搞了OpenStack 后才算了解了一些IaaS,只有在用了 OpenShift 后才算了解了一些PaaS.这两个产品,对我都有云启蒙性的帮助

new/delete 与 malloc/free的区别

一.概述 在C++中,申请动态内存与释放动态内存用new/delete 与 malloc/free都可以,而且他们的存储方式相同,new/malloc申请的动态内存位于堆中,无法被操作系统自动回收,需要对应的delete也free释放空间. malloc/free是C/C++语言的标准库函数,在C语言中需要头文件#include<stdlib.h>的支持.而new/delete是C++的运算符.对于类对象而言,malloc/free无法满足动态对象的要求,对象要求在创建的同时自动执行构造函数,

C++拾遗--malloc free与new delete的同与不同

C++拾遗--malloc free与new delete的同与不同 前言 在C中我们常使用malloc和free来动态分配与释放内存,在C++中对应的是new和delete.这里我们来探讨下他们的同与不同. 正文 1.内置类型 对相同的代码进行调试,查看内存 #include <iostream> using namespace std; int main() { int *p = (int*)malloc(sizeof(int) * 10); cout << p <<

malloc/free与new/delete的区别

相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求.对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数.由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free. (2)用法上也有所不同.函数malloc 的原

C/C++语言的标准库函数malloc/free与运算符new/delete的区别

概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求.对象在创建的同时,要自动执行构造函数,对象在消亡之前要自动执行析构函数.而由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符

malloc free 和new delete区别

从网上看的学习之 1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,与"+"."-"."*"."/"有一样的地位. 2. new/delete是可以重载的,而重载之后,就成为了函数. 3. malloc在申请内存的时候,必须要提供申请的长度,而且返回的指针是void*型,必须要强转成需要的类型. 4. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存