[C ++]動的メモリ割り当てとメモリリーク

著作権:ソースを明記してくださいhttps://blog.csdn.net/weixin_40937100/article/details/88848886

動的なメモリ割り当て


1.新しいおよび削除

函数原型:
void *型new演算子は(size_t); //オブジェクトの割り当て
(*空)のvoid *演算子は削除します。//オブジェクト無料

1.1新、削除操作機構(単一のオブジェクト)

例えば、クラスAの場合:

class A
{
public:
    A(int v) : var(v){
        fopen_s(&file, "test", "r");
    }
    ~A(){
        fclose(file);
    }
private:
    int var;
    FILE *file;
};

我々はメモリ空間に新しい、新しいポイントを持つクラスAの配列へのポインタを作成するとポインタ型のAを返されます

クラス*のpA =新しいA(10)。

作品の完成の後ろにある
ここに画像を挿入説明
新しい仕事、次は、次のとおりです。

  1. クラスのサイズに8バイト(「綿密なC ++オブジェクト・モデル」を参照)で、新しい機能は、アドレス空間の8つのバイトを開きますが、メモリ空間は初期化され型付けされていません
  2. メモリ空間は、クラスオブジェクトを初期化します。基本的なプライベート変数への代入に、コンストラクタを呼び出し、変数ポインタは、対応する位置を指しています
  3. オブジェクトポインタを返します。

我々は、削除してクラスオブジェクトを解放するとき

pAのを削除します。

作業が行われている背景には:
ここに画像を挿入説明
削除作業次のとおりです。

  1. ポインタの指すオブジェクトは、開いているファイルを閉じるためのデストラクタを呼び出します
  2. オブジェクトのために解放されたメモリ空間を削除するには、ライブラリ関数を呼び出すことによって、入ってくるパラメータは、オブジェクトのアドレスポインタペンシルバニアれます
新しいタイプの1.2 []、およびアプリケーションとリリースの[]アレイを削除

1.基本データ型空間のアレイの適用および放出
ここに画像を挿入説明
ここに画像を挿入説明
ここでは、検索異なるアレイを作成して、単一のオブジェクトを作成し、ここで新しいおよび削除されますなる:
タイプ*新しいタイプ名= [];
[]名を削除します。

在上面的例子中,释放string类型数组空间时实际上先为10个string对象分别调用析构函数,再释放掉为10个string对象所分配的所有内存空间;而释放int类型数组空间时,因为int是内置类型不存在析构函数,所以直接释放掉了为10个int类型变量分配的所有空间。

因此,非内置类型数据用new type[] 来动态分配内存时,必须保存数据的维度,以确定在析构时需要调用对象析构函数的次数。C++的做法是在分配数组空间时在前面多分配了4 Bytes 大小的空间,专门保存数组的维度,在delete的时候根据数据维度调用析构函数,最后再释放所有内存空间。

以创建pA类对象数组为例说明 Type *name = new Type[] 和 delete[] name的运行机制
首先为对象数组分配内存空间:

class A *pAa = new A[3];

背后的工作是:
ここに画像を挿入説明
当我们释放对象数组的内存空间时:

delete [] pAa;

背后的工作是:
ここに画像を挿入説明
正如前面所说:依次为数组中每个对象调用析构函数,调用析构函数的总次数是由调用new库函数时开辟的内存空间的前4 Bytes 中保存的数据决定的;调用delete[] name 库函数时,其参数不是指针name的值(也是第一个数组元素的地址),而是这个地址值减去4 Bytes

1.3 内存泄漏

ここに画像を挿入説明

2. malloc 和 free

  1. 头文件是#include<stdlib.h>,函数声明为:

void* malloc(size_t size);

  1. 参数size_t size表示动态内存分配空间的大小,以字节为单位。
  2. malloc()函数的返回值是一个指针,或者说是分配后内存空间的首地址.
  3. 如果malloc()函数申请空间成功则返回一段内存空间的首地址,失败则返回NULL
  4. 返回指针类型需要强制类型转换(有安全隐患)

int型* P =(int型*)はmalloc(はsizeof(int型));

  1. 宇宙のmalloc()関数のアプリケーションを使用する前に、好ましくはmemset()関数で、このメモリ空間をクリーンアップします。スマート保証のmalloc関数メモリのサイズは、その保証はありませんゴミデータ
  2. mallocとfreeは、それ以外の場合は、メモリリークとなり、ペアで使用します

ケース:

//0.包含头文件<stdlib.h>
//1.定义一个char* 指针变量p,并分配10个字节内存空间(字符数组)
char *p = (char *)malloc(sizeof(char));

//2.将字符数组中的内容全部修改为0
memset(p, 0, 10 * sizeof(char));

//3.复制一段字符串到p指向的数组空间(长度要比所分配的内存小)
strcpy(p, "hello ");

//4.用realloc扩充p指向的内存空间
p = (char*)realloc(p, 20 * sizeof(char));

//4.在原字符串后面再拼接一段字符
strcat(p, "world");

//5.释放空间
free(p);


の自由な差3.new/deleteとのmalloc /

ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
その他(上記の重複):

  1. 新しい、C ++は、演算子(キーワード)で削除し、あなたは、特定の構文で表現を形成することができます。mallocとfreeは、標準ライブラリ関数です。
  2. 無料ではなく、オペレータは、コンパイラの制御範囲内にないライブラリ関数malloc関数は、自動的にコンストラクタとデストラクタを呼び出すことではありません。malllocだけ変数が割り当てられたメモリ、空きメモリはただの変数を発表しました。
  3. 新しいアプリケーションは、オブジェクトのためのメモリ空間を割り当てると、自動的にコンストラクタを呼び出すだけでなく、オブジェクトの初期化を完了することができます。同様に、削除は自動的にデストラクタを呼び出すことができます。
  4. 新しい戻り、指定した型へのポインタと、自動的にメモリ要求のサイズを計算することができる。我々は、メモリサイズのためのmallocを計算する必要があり、かつ強制的に復帰上のポインタの実際の型に変換します。
  5. 新しいフリーストアからメモリを割り当て、malloc関数は、ヒープからメモリを割り当てます。
  6. malloc関数、自由、新しいと比較すると、動的にメモリ領域を割り当て削除しないだけ、とオブジェクトを初期化し、破壊するコンストラクタ、デストラクタを呼び出します。

参照:
C / C ++ - C ++でmallocと新しい新たな10点の差
の例を使用してC ++読書ノート-malloc()関数、及び注意点

おすすめ

転載: blog.csdn.net/weixin_40937100/article/details/88848886