2016-04-20 11 views
0

私はコード自体によって大規模な側線がありましたが、thisを解決するツールを作っています。関数によって作成された配列を削除する

私はさまざまな場所で、配列(ポインタ)を返す関数を持っています。ほとんどの場合、それらの関数は再帰的であり、内側の呼び出しで作成された配列はあとで役に立たないかもしれません。

私はdelete[]を使用しようとしました。コンパイラが不満を言っておらず、プログラムが正常に動作したにもかかわらず、膨大な量のメモリが割り当てられていたことがわかりました。 コードはこのような何かに見えた:(?またはまったく何も)配列がスコープの外に作成されたとき、場合、私はその後、自分自身を尋ね

template <typename Type> Type* foo(unsigned short size,...) 
{ 
    //... 
    Type *tmp; 
    //... 
    tmp=foo(param,...); 
    //... 
    delete[] tmp; 
    //... 
} 

delete[]が実際に割り当てられたすべてのメモリまたは単に最初のインデックスを削除します。

私はこのように見えるように、コードのその部分を書き直し:

template <typename Type> Type* foo(unsigned short size,...) 
{ 
    //... 
    Type *tmp; 
    //.. 
    tmp = new Type[i]; 
    tmp = foo(param,...); 
    //... 
    delete[] tmp; 
    //... 
} 

メモリの消費量が低く、しかし、私はすぐに私はちょうどfoo(...)を呼び出す前に作成された配列が実際に今までに...削除されなかったことに気づきました。

だから、最後に私が試した:

template <typename Type> Type* foo(unsigned short size,...) 
{ 
    //... 
    Type *tmp, *dump; 
    //.. 
    dump = tmp = new Type[i]; 
    tmp = foo(param,...); 
    delete[] dump; 
    //... 
    delete[] tmp; 
    //... 
} 

しかし、私はちょうど問題さらに一歩移動すると、さらに別のアレイを作成する過程にありました。 メモリ消費が急増していることは間違いありません。ここ

質問は以下のとおりです。

  • どのように私はこの問題を解決するのですか?
  • 最初の変更でメモリ消費量が低下したのはなぜですか?

私は本当にすべての適切なコードを書き換えが主要な作業のように思えるのでstd::vectorを使用して、ため、新人として、私は一種の私が書くためのライブラリの助けを必要としなかったことを知って良い感じにしたくありません私のプログラム(明らかに私はまだそれらを使用しています;例えば、<iostream>のようなものに何が書き込まれるのか想像できません)。

PS:GitHubのコードです。

PPS:私は英語を謝っています。ネイティブスピーカーではありません。

+0

を使用して、新しい[] 'そして'を割り当てる場合:あなたが書く必要があります'delete []'で解放してください(そして 'malloc'や' calloc'で割り当てた古いC関数がある場合は 'free'を使います)。割り当てがいつどこで発生するかは問題ではありません。 –

+0

さらに簡単な問題解決策がありますが、問題は全体的に問題になります:['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。 「動的配列」や「ランタイム割り当て配列」などと思うときは、いつでも[std :: vector'](http://en.cppreference.com/w/cpp/container/vector)と考えるべきです。 –

+0

私は 'std :: vector'を使うかもしれません。実際にはプログラム自体が特定の配列のサイズを計算し、代わりにネイティブのものを使用すると2回のコードを2回実行させるためです。最初にサイズを計算し、次にデータを入力します。 –

答えて

1
What is the correct way to do this? 

あなたはnew T[]delete[]とをペアリングする必要がありません - 魔法をここに。あなたがそれを正しく行うことを確認するには、アレイのバージョンstd:unique_ptr<T[]> - versionを使用してください。または - std :: vector、しかしあなたはそれが好きではないと言った。

Why did memory consumption lowered with the first change? 

はilogicalようだ、あなたはより多くのメモリを割り当てられ、それがドロップされた....

私はあなたのgithubのプロジェクトを見ていたと私はthisが見つかりました:

delete[] slhs, srhs;    //Deletes the now useless sorted arrays. 

削除[]ありません配列を削除すると、srhsだけが解放されることを覚えています。

delete[] srhs; 
delete[] slhs; 

は、このような他の場所を見つけるか、またはあなたがDELETE` `でそれを解放new``とメモリを割り当てる場合std::unique_ptr<>

+0

ありがとう、私はこれらのスマートポインタについて学ぶ時間があるとすぐにこれを試していただきます。修正が終わったら私は更新します。 –

+0

私は両方を試みました。 'unique_ptr'を使い、' delete [] 'がリストで呼び出されたインスタンスを見つけることができます。明らかに、私は 'unique_ptr'でもっともメモリ消費量が少なくなっていますが、パフォーマンスは低下しました。同じパラメータでプログラムを実行するには数倍の時間がかかります。 –

関連する問題