面接---ダイナミックメモリの転送
3735 ワード
このプログラムのテストの結果は何ですか?
解析:void GetMemory(char*p,int num)の*pは実際にはメイン関数のstrのコピーであるため、コンパイラは常に関数の各パラメータに一時的なコピーを作成します.本例では,pは新しいメモリを申請したが,pが指すメモリアドレスを変更しただけでstrは少しも変わっていない.GetMemoryは値を返さないため、strはpが申請したメモリを指さないため、関数GetMemoryは何も出力できません.実際、GetMemoryを実行するたびにメモリを申請しますが、申請したメモリは有効に解放されず、結局メモリが独占され続け、最終的にメモリが漏れてしまいます!!!
答え:プログラムがクラッシュしました.GetMemoryはダイナミックメモリを渡すことができないため、Test関数のstrは常にNULLです.
//———————————————————————————————————————以下は正常な申請方式である.
方法1:ポインタパラメータでメモリを申請する場合,ポインタを指すポインタを用いてstrのアドレスを関数GetMemoryに渡す
結果:
strは文字列の値です.*strは文字列のある文字の値で、デフォルトは先頭文字なのでh;&strは文字列のアドレス値です.
//————————————————————————————————
【メモリ操作および問題に関する知識点】動的メモリ伝達の問題を徹底的に解決するために、メモリ管理の知識ポイントを振り返る.
メモリの割り当て方法は3つあります.
静的ストレージ領域から割り当てます.メモリはプログラムのコンパイル時にすでに割り当てられており、この内にプログラムが存在する全実行期間が存在します.たとえばグローバル変数、static変数です.
スタックから割り当てられ、ダイナミックメモリ割り当てとも呼ばれます.プログラムは実行時にmallocまたはnewで任意のメモリ数を申請し、プログラマー自身がfreeまたはdeleteでメモリをいつ解放するかを担当します.ダイナミックメモリの生存期間は私たちが決定し、非常に柔軟に使用できます.
スタックに作成します.関数を実行すると、関数内のローカル変数のメモリセルがスタック上に作成され、関数の実行が終了すると、これらのメモリセルが自動的に解放されます.スタックメモリ割り当て演算はプロセッサの命令セットに組み込まれており,効率は高いが,割り当てられたメモリ容量は限られている.
#include <iostream.h>
#include<cstring>
#include<stdlib.h>
using namespace std;
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
int main()
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str, "hello");
return 0;
}
解析:void GetMemory(char*p,int num)の*pは実際にはメイン関数のstrのコピーであるため、コンパイラは常に関数の各パラメータに一時的なコピーを作成します.本例では,pは新しいメモリを申請したが,pが指すメモリアドレスを変更しただけでstrは少しも変わっていない.GetMemoryは値を返さないため、strはpが申請したメモリを指さないため、関数GetMemoryは何も出力できません.実際、GetMemoryを実行するたびにメモリを申請しますが、申請したメモリは有効に解放されず、結局メモリが独占され続け、最終的にメモリが漏れてしまいます!!!
答え:プログラムがクラッシュしました.GetMemoryはダイナミックメモリを渡すことができないため、Test関数のstrは常にNULLです.
//———————————————————————————————————————以下は正常な申請方式である.
方法1:ポインタパラメータでメモリを申請する場合,ポインタを指すポインタを用いてstrのアドレスを関数GetMemoryに渡す
#include <iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
void GetMemory(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
int main()
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
cout << *str <<endl;
cout << str <<endl;
cout << &str <<endl;
return 0;
}
結果:
h
hello
0x28ff1c
Process returned 0 (0x0) execution time : 0.241 s
Press any key to continue.
strは文字列の値です.*strは文字列のある文字の値で、デフォルトは先頭文字なのでh;&strは文字列のアドレス値です.
//————————————————————————————————
【メモリ操作および問題に関する知識点】動的メモリ伝達の問題を徹底的に解決するために、メモリ管理の知識ポイントを振り返る.
メモリの割り当て方法は3つあります.
静的ストレージ領域から割り当てます.メモリはプログラムのコンパイル時にすでに割り当てられており、この内にプログラムが存在する全実行期間が存在します.たとえばグローバル変数、static変数です.
スタックから割り当てられ、ダイナミックメモリ割り当てとも呼ばれます.プログラムは実行時にmallocまたはnewで任意のメモリ数を申請し、プログラマー自身がfreeまたはdeleteでメモリをいつ解放するかを担当します.ダイナミックメモリの生存期間は私たちが決定し、非常に柔軟に使用できます.
スタックに作成します.関数を実行すると、関数内のローカル変数のメモリセルがスタック上に作成され、関数の実行が終了すると、これらのメモリセルが自動的に解放されます.スタックメモリ割り当て演算はプロセッサの命令セットに組み込まれており,効率は高いが,割り当てられたメモリ容量は限られている.