理解のメモリリークのC/C++[定休日]
-
29-09-2020 - |
質問
この例はこちらhttps://blog.parasoft.com/finding-memory-leaks-in-c
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *string, *string_so_far;
int i, length; length = 0;
for(i=0; i<argc; i++) {
length += strlen(argv[i])+1;
string = malloc(length+1);
/* * Copy the string built so far. */
if(string_so_far != (char *)0)
strcpy(string, string_so_far);
else *string = '\0';
strcat(string, argv[i]);
if(i < argc-1) strcat(string, " ");
string_so_far = string;
}
printf("You entered: %s\n", string_so_far);
return (0);
}
読んが生まれプログラムを実行すると以下の引数:
hello this is a test
変数のstring_so_farポイントの文字列"こんにちは"割り当てられたもの結果としては前のループになります。いるようで分からないいかがですか?ステップによるステップを説明する。
第二に、私が見つけたこの例では、コースの素材:
int countPrimes(int n)
{
PrimeSet *p = new PrimeSet(n);
return( p->countPrimeNumbers() );
}
で述べてがここにメモリリークがないかどうか、私には何が起こっています。
解決
最初の例では、ご利用の malloc
内部ループのための変数となります。の malloc
コ埋蔵量のメモリブロックを返しますブロックの最初のアドレスです。必要なものを削除するブロック free
の場合の必要がなくなります。の場合はプログラマーの希望を延長するメモリブロックは、より良い代替する realloc
.について realloc
時 http://www.cplusplus.com/reference/cstdlib/realloc/.
お二つ目の例では、オブジェクトのポインタ p
ポイントが初期化されるヒープとは、ヒープまでのプログラマが使用 delete
.より安全な代替オブジェクトの作成は、ヒープが作成でスタックは、すべてのデータを削除した後のメソッドの呼び出しは終了しました。
int countPrimes(int n){
PrimeSet p(n);
return( p.countPrimeNumbers() );
}
メモリ管理が適正に行われているかのように二つ目の例では、オブジェクトは削除することができませんの後にのみ参照では失われるメモリリークなどが挙げられる。
他のヒント
お二つ目の例では、空間を割り当てのためのPrimeSetオブジェクトinitialiseで呼ぶことができまcountPrimeNumbersます。のPrimeSetオブジェクト存在しないものを占めるメモリのそれぞれの割り当てメモリー、メモリーが占います。ことになるメモリリーク:るメモリの占有で使う事が出来なくなります。