2012-03-29 5 views
2

の回数カウントするようにnew演算子を使用する方法:ostringstreamこの方法を使用しているとき、私は動的なメモリ割り当ての回数をカウントしたい次のコードを考えると、動的メモリ割り当て

int i; 
... 
ostingstream os; 
os<<i; 
string s=os.str(); 

を。どうやってやるの?たぶんoperator new

ありがとうございます。

答えて

5

はい、ここであなたがそれを行うことができる方法である:私の環境(Ubuntuの10.4.3、G ++)で

#include <new> 
#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <vector> 
#include <sstream> 

int number_of_allocs = 0; 

void* operator new(std::size_t size) throw(std::bad_alloc) { 
    ++number_of_allocs; 
    void *p = malloc(size); 
    if(!p) throw std::bad_alloc(); 
    return p; 
} 

void* operator new [](std::size_t size) throw(std::bad_alloc) { 
    ++number_of_allocs; 
    void *p = malloc(size); 
    if(!p) throw std::bad_alloc(); 
    return p; 
} 

void* operator new [](std::size_t size, const std::nothrow_t&) throw() { 
    ++number_of_allocs; 
    return malloc(size); 
} 
void* operator new (std::size_t size, const std::nothrow_t&) throw() { 
    ++number_of_allocs; 
    return malloc(size); 
} 


void operator delete(void* ptr) throw() { free(ptr); } 
void operator delete (void* ptr, const std::nothrow_t&) throw() { free(ptr); } 
void operator delete[](void* ptr) throw() { free(ptr); } 
void operator delete[](void* ptr, const std::nothrow_t&) throw() { free(ptr); } 

int main() { 
    int start(number_of_allocs); 

    // Your test code goes here: 
    int i(7); 
    std::ostringstream os; 
    os<<i; 
    std::string s=os.str(); 
    // End of your test code 

    int end(number_of_allocs); 

    std::cout << "Number of Allocs: " << end-start << "\n"; 
} 

、答えは "2" です。


EDIT:new演算子は、組み込み型のオブジェクトを割り当てるために使用されたときに、グローバルオペレータに新しい関数が呼び出され MSDN

を引用し、USER-含まれていないクラス型のオブジェクト定義された演算子の新しい関数、および任意の型の配列が含まれます。 new演算子を使用して、演算子newが定義されているクラス型のオブジェクトを割り当てると、そのクラスの演算子newが呼び出されます。

クラスoperator newがあるない限り、すべての新しい表現は、グローバルoperator newを呼び出します。あなたがリストしたクラスについては、クラスレベルがないと信じていますoperator new

+0

私は参照してください。ですから、 'operator new'は、すべての動的メモリ割り当てが、定義されているバージョンを呼び出す必要があるという意味でグローバルです。 –

+0

最新の編集をご覧ください。 –

1

動的に割り当てられたオブジェクトをカウントする場合は、 クラスのnew演算子をオーバーロードしてカウントロジックを追加する必要があります。

グッド読む:あなたは、Linux(glibcでは)を使用している場合は
How should I write ISO C++ Standard conformant custom new and delete operators?

+0

完全な例を教えてください。ありがとう! –

+1

@littleEinstein:リンクを確認してください。 –

+0

そうですね、私はオペレーター・ニューがどのように機能するかをある程度知っています。しかし、私はそれをどのように 'ostringstream'に適用するのか分かりません。私は必然的に具体的な例が必要です。 :) –

0

、あなたはすべての動的メモリ割り当てをログに記録するa malloc hookを使用することができます。

関連する問題