动态内存分配(c++)

  1. 内存分配方式

    (1)从静态存储区域分配。内存在编译的时候就已经分配好了,在整个程序执行运行期间一直存在。如:全局变量,static变量。

    (2)在栈上创建。在执行函数时,函数内部的局部变量的存储单元在栈上创建。函数执行结束后局部变量的存储单元自动释放。

    (3)在堆上创建。也称动态内存分配。程序在运行的时候用new或malloc申请任意的内存,程序员自己负责何时用delete或free释放内存。

  2. 我们都知道c语言开辟以及释放空间用malloc和free。而在c++中却用new和delete。。

这是为什么呢?

首先,malloc和free是c/c++语言的标准库函数。而new和delete是c++的运算符。它们都是用来动态开辟内存和释放内存。

对于对象而言,光用malloc和free无法满足动态对象的要求。对象在创建的同时要执行构造函数初始化对象,在消亡之前要调用析构函数清理对象。由于malloc和free是库函数不是运算符,不能够把执行构造函数和析构函数的任务强加到malloc和free。

所以c++语言需要一个能够完成动态内存分配和初始化工作的运算符new,以及一个清理和释放内存工作的运算符delete。

注:new和delete不是库函数,是运算符。

3. malloc/free与new/delete的联系

(1)动态内存管理的入口

(2)malloc和free是c/c++语言的标准库函数。而new和delete是c++的运算符。

(3)malloc/free动态开辟空间及释放,new/delete动态开辟空间调用构造函数初始化,清理内存之前调用析构函数。

(4)malloc/free手动计算类型大小,返回void *,而new/delete自动计算类型大小,返回对应类型的指针。

4.new和delete

(1)

p1:开辟了一个整型空间

p2:开辟了一个整型空间,并初始化为100.

注:new运算符实际上调用了 operator new()函数,而operator new()函数中又调用了malloc函数。

delete运算符实际上调用了operator delete()函数。而operator delete()函数又调用_free_dbg()函数。

(2)

p3:开辟了10个整型空间

调用10次构造函数以及10次析构函数。

注:new运算符实际上调用了 operator new[]()函数。operator new[]()函数调用了 operator new()函数,而operator new()函数中调用了malloc函数。

delete运算符实际上调用了operator delete[]()函数。operator delete[]()函数调用了operator delete()函数,而operator delete()函数又调用_free_dbg()函数。

注:malloc/free,new/delete, new[]/delete[]必须匹配,否则内存泄露,程序崩溃。

c++的其他内存管理接口:

void *operator new(size_t size)

void operator delete(size_t size)

void *operator new[](size_t size)

void operator delete[](size_t size)

5.定位new表达式

在已分配的原始空间上调用构造函数初始化。

new (place_address) type

  new (palce_address) type (initializer-list)

place_address必须是一个指针,指向已经分配好的内存。

模拟:

A* p = new A[10];

delete[] p;

#include <iostream>

using namespace std;

class A

{

public:

A(int a = 10)

:_a(a)

{

cout<<"A(int a = 10)"<<endl;

}

~A()

{

cout<<"~A()"<<endl;

}

private:

int _a;

};

int main()

{

A* p = (A *)operator new[](10*sizeof(A)+4);

int i = 0;

int count  = 0;

*(int *)p = 10;

A *pStart = (A *)((int *)p+1);

for(i=0;i<10;i++)

{

new((A *)(int *)pStart + i) A(i);

}

count = *(int *)(pStart - 1);

for(i=0;i<count;i++)

{

pStart[i].~A();

}

operator delete[] ((A *)(int *)pStart-1);

return 0;

}

时间: 2024-11-20 18:46:24

动态内存分配(c++)的相关文章

C++动态内存分配

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 C / C ++中的动态内存分配是指程序员手动执行内存分配, 动态分配的内存分配给堆,非静态和局部变量获取在Stack上分配的内存.详情查看上篇博文:C程序的内存布局. 什么是应用程序? 动态分配的

【C语言天天练(九)】动态内存分配

引言:数组的元素存储于内存中连续的位置上.当一个数组被声明时.它所须要的内存在编译时就被分配. 可是,我们能够使用动态内存分配在执行时为它分配内存. 一块内存的生命周期能够分为四个阶段:分配.初始化.使用.释放. 内存的分配一般使用C函数库里的malloc函数(原型:void *malloc(size_t size)). 关于malloc函数应该注意一下几点: 1.malloc的參数就是须要分配的内存的字节数. 2.malloc所分配的是一块连续的内存. 3.分配成功.则返回指向分配内存起始地址

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

继承和动态内存分配

假设基类使用了动态内存分配,而且定义了析构函数.复制构造函数和赋值函数,但是在派生类中没有使用动态内存分配,那么在派生类中不需要显示定义析构函数.复制构造函数和赋值函数. 当基类和派生类采用动态内存分配时,派生类的析构函数.复制构造函数.赋值运算符都必须使用相应的基类方法来处理基类元素.这种要求是通过三种不同的方式来满足的.对于析构函数.这是自动完成的,也就是说在派生类的析构函数中无需显示调用基类的析构函数.对于构造函数,这是通过在初始化成员类别中调用基类的复制构造函数来完成的,如果不这样做,将

【Cpp】考点·堆栈&amp;动态内存分配

动态内存分配 堆内存分配与释放 C/C++定义了四个内存区间:代码区,全局变量与静态变量区,局部变量区(栈区),动态内存区(堆区) 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配.有些操作对象只在程序运行时才确定,这样编译时无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配.所有动态存储分配都在堆区中进行. 当程序运行到需要一

C++ 动态内存分配(6种情况,好几个例子)

1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配: 有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分

28._动态内存分配

动态内存分配 传统数组的缺点(静态内存分配):   1.数组长度必须事先指定,且只能是常整数,不能是变量    例子:     int a[5]; //OK     int len = 5; int a[len]; //error   2.传统形式定义的数组,该数组的内存程序员无法手动编    程释放,在一个函数运行期间,系统为该函数中数组所     分配的空间会一直存在,直到该函数运行完毕时,数组    元素所占存储空间才会被系统释放 3.数组的长度一旦定义,长度就能被改变     4.A函数

一维和二维数组 动态内存分配

一维数组的动态内存分配 #include "stdafx.h" #include <iostream> using namespace std; int main() { int length,i; int *p; cin>>length; p=new int[length]; for(i=0;i<length;i++) { p[i]=i; //不要写成*p[i]=i; cout<<p[i]<<endl; //不要写成cout<

Lesson(DynamicMerry)动态内存分配

//  main.m //  1-27随堂笔记 //讲师: 小辉 //笔者: 王学文 //  Created by lanouhn on 15/1/27. //  Copyright (c) 2015年 lanouhn. All rights reserved. //动态内存分配(DynamicMerry) #import <Foundation/Foundation.h> void test() { int x = 10; int y = 20; } //函数返回栈区的数据,是不安全的;一i

动态内存分配函数与释放函数

(1)分配函数 void *malloc(sizeof(unsigned size) 功能:在内存的动态存储区中分配一块长度位size的连续空间. 返回值:指针,存放被分配内存的起始地址.若未申请到空间,则返回NULL(0). void *:指向任何类型的数据,在使用时,要进行强制类型转换. 例如:int *malloc(sizeof(int)) struct student *malloc(sizeof(struct student)) (2)释放函数 void free(void *ptr)