1

私は大きなコードを書いており、さまざまなタイプの配列を安全に作成および拡張するためにメモリ クラスを用意しました。このクラスでは、新しいポインターを割り当てるときに sizeof を使用して割り当てられたメモリのサイズを追跡します。ただし、メモリの割り当てを追跡する方法がわかりません。私の質問を別の言い方にしましょう。たとえば、コードのある時点で新しい配列を割り当てるとします。

double* array=new double[size];

サイズを知らずにメモリの割り当てを解除したい他の場所、通常は使用します

delete [] array;

delete 演算子は配列のメモリを自動的に解放しますが、解放されるバイト数を特定する方法はありますか (サイズを追跡しないと仮定して)?

4

5 に答える 5

2

一般に、答えはノーです。なぜなら、メモリ マネージャーはその種の実装に依存する情報をユーザーから隠しているからです。また、C++ には、実際に使用/解放されたメモリの量を追跡する標準的な方法がありません。特定のプラットフォーム/オペレーティング システムに固有の機能があるかもしれませんが、100% 移植できるものはありません。

于 2013-08-01T21:26:16.017 に答える
0

割り当てられたメモリを追跡するには、たとえば、割り当てられたバイトをカウントする静的 (プライベート) メンバーを使用して、何らかのカウントメカニズムを手動で実装する必要があります。

于 2013-08-01T21:29:22.823 に答える
0

代わりにa を使用し、std::vector削除するときにこれを事前に呼び出して、クリアされvec.capacity() * sizeof(OBJECT)た量を確認できます。ベクトルに格納されているバイト数が得られます。

于 2013-08-01T21:27:08.620 に答える
0

メモリの割り当てと割り当て解除を完全に制御したい場合は、
memory pool.

自作のメモリ プール高速安全で、実装が比較的簡単です。このようなメカニズムを実装すると、メモリリークなどのあらゆる種類の情報も提供されます。リンクされたリストには割り当てられたメモリの合計が保持されるため、解放されたメモリの計算も簡単です。

をクリックしbig friendly buttonて飛び込みます。

于 2013-08-01T21:29:32.107 に答える
0

別の回答がすでに受け入れられていることは承知していますが、メモリ配列を非常に単純に追跡したい場合は、独自のアロケーターを作成する方法を次に示します。

#include <map>
#include <iostream>

using namespace std;

map<void*,size_t> memmap; //put this as a global variable in an implementation file, and extern it in the header file.

class MyManagedClass{
public:
    MyManagedClass(){}
    void* operator new[](size_t sz){
        void* out = operator new(sz*sizeof(MyManagedClass));
        for(size_t i=0; i<sz; ++i) 
            *((MyManagedClass*)out+sz)=MyManagedClass::MyManagedClass();
        memmap[out] = sz;
        return out;
    }

    void operator delete[](void* t){
        cout << "Freed units: " << memmap[t] << endl;
        memmap.erase(t);
        delete[] t;
    }
};

int main(){
    MyManagedClass* ip = new MyManagedClass[10];
    delete[] ip;
    system("pause");
}

私はこれがそれを行うための厄介な方法であり、おそらくテンプレートとより考え抜かれたメモリ設計を使用して、より適切/一般的にすることができることに言及する必要があります笑。

于 2013-08-01T21:57:14.993 に答える