(C++)6.9メモリ動的割り当て(new,delete)


動的割り当ては厄介な問題です.わかりました.気持ちがいいですね.疲れても聞いてから行きましょう.( •̀ ω •́ )✧
#include <iostream>

using namespace std;

int main()
{
	int var;
	int *ptr = new int;

	*ptr = 7; // 역참조를 해줘야 함.


	return 0;
}
ほとんどの場合、変数を宣言すると、int var;のように変数を宣言します.newを利用して宣言したらどうなりますか?
newを使用して、データ型サイズに基づいてosからメモリを受信し、メモリアドレスを教えてください.だから針で受け止めて
しかし、なぜnewを使って変数を生成しなければならないのでしょうか.int var;のように使えばいいのに、どうしてしなければならないのですか.原因を調べてみましょう.
例えば、int var[1000000]が宣言されたと仮定する.コンパイルすれば問題ありません.プログラマーにとって、百万という数字も大きな数字ではありません.ただし、デバッグすると不明なエラーが発生します.この問題を解決したのもnewです.
#include <iostream>

using namespace std;

int main()
{
	int var;
	int *ptr = new int{ 7 };
	

	//*ptr = 7;  역참조를 해줘야 함.

	cout << ptr << endl;
	cout << *ptr << endl;

	return 0;
}

output : 013AE210
	 7
初期化することもできます.コードに統合初期化を使用して初期化します.

さらに重要なのは、割り当てられたメモリをosに返すことです!!(とても重要です!)


->割り当てられたメモリを返却する必要がある理由は次のとおりです.人工知能を使用したり、ビッグデータを利用してコードを記述したりする場合、コンピュータのメモリを超える量を使用することが多く、この場合に割り当てられたメモリを返すと、メモリオーバーフロー(Out of Memory)が発生しないようにすることができます.
#include <iostream>

using namespace std;

int main()
{
	int var;
	int *ptr = new int{ 7 };

	cout << ptr << endl;
	cout << *ptr << endl;

	delete ptr;

	return 0;
}
簡単な例を挙げるとそうです.deleteを使用します.これは、プログラムが閉じる前にosに割り当てられたメモリをosに返すことを意味します.では、さっきは役に立たなかったのに、どうして今使わなければならないのですか.このような疑問が生じる.さっきの状況では、osがどのメモリを使用しているか知っていたので、プログラムが終了すると自動的に持ち去るので、エラーは発生しません.△現段階では、データ量が少ないからだと思います.
では、deleteを作ってからコードでどうなるか見てみましょう.
#include <iostream>

using namespace std;

int main()
{
	int var;
	int *ptr = new int{ 7 };

	cout << ptr << endl;
	cout << *ptr << endl;

	delete ptr;

	cout << "After delete" << endl;
	cout << ptr << endl;
	cout << *ptr << endl;

	return 0;
}

output : 00EA0550
	 7
	 After delete
	 00008123
コンパイラによっては同じアドレス、異なるアドレスが現れることもありますが、異なるアドレスが現れると、私の場合と同じです.このような状況に対して.
https://stackoverflow.com/questions/33374483/what-does-visual-studio-do-with-a-deleted-pointer-and-why参照の方が良いです.要するに、コンパイラオプションからオフにすることもできます.詳細はリンクを参照してください.
その後classでこれらのプロセスを処理します.

通常はnullptrが使われていて、とても役に立ちます.しかし、このような状況は実際にはあまり使われていない.あとで学ぶスマートポインタの概念がありますが、その時までに「こんなものもあったのかな」と考えてみましょう.
また、newを使ってメモリを割り当てたい場合がありますが、できません.OSがすべてのメモリを使用している場合.この場合は2つありますが、
  • プログラムを殺す.
  • 他のメモリが切れるのを待つ方法.
  • 1、2の場合、newを使用して作成された変数に使用可能なメモリが表示されるのを待つ必要があります.int *ptr = new (std::nothrow) int{ 7 };を使用すると、エラーなく使用できます.これは異常処理に含まれる概念で、後で異常処理を学びながら復習しましょう!!

    また,符号化時に最も恐ろしいのはメモリ漏洩である.


    この問題は本当に恐ろしい.
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	//memory leak
    
    	while (true)
    	{
    		int *ptr = new int;
    		cout << ptr << endl;
    	
    	}
    
    	return 0;
    }
    コードを表示すると、割り当てられたメモリがクリアされずに新しいメモリを受信し続けることがわかります.実際、ジョブマネージャを開いて上のコードを実行すると、赤い危険が表示され、このまま続けるとコンピュータが故障します.このような事態を防止するためには、常にdeleteを使用して防犯しなければならない.次のコードのようです.
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	//memory leak
    
    	while (true)
    	{
    		int *ptr = new int;
    		cout << ptr << endl;
    
    		delete ptr;
    	
    	}
    
    	return 0;
    }
    visualstudioで見たい場合は、デバッグして確認できます.右側にDiagnostic Toolsがない場合は、左上隅Debug->window->Diagnostic Toolsをクリックすると、右上隅で生成されます.

    番組をうまくやるには、newdeleteを少なくしたほうがいいです.理由はosからメモリを受け取ってから渡すから...受け取る、与えると速度が遅くなるからです.