2017-09-08 21 views
1

私はこれに疑問を持っています。これは疑問です。なぜnewは3回呼び出され、deleteは3回呼び出されますか?

私は新しく削除するための演算子のオーバーロードをしようとしている簡単なプログラムがあります。

私はオペレータが新しいスコープから離れてグローバルスコープで新規および削除のためにオーバーロードを試みました。

#include<iostream> 
#include<stdio.h> 
#include<stdlib.h> 
using namespace std; 

void * operator new(size_t size) 
{ 
    cout<<"\n\nGlobal scope new:\n"; 
    void * ptr = malloc(size); 
    return ptr; 
} 

void operator delete(void *ptr) 
{ 
    cout<<"\n\nGlobal scope delete:\n"; 
    free(ptr); 

} 

    class test 
    { 

     public: 
    int age; 
    string name; 

test(string str, int a) 
{ 
    age = a; 
    name = str; 
} 
void display(); 
}; 

void test::display() 
{ 
    cout<<"\n\nname is:-"<<name<<" and age is :- "<<age<<endl; 
} 


int main() 
    { 

    test *t = new test("sanjeev",29); 
    if(t!=NULL) 
    cout<<"\n\nMemory allocated:"<<endl; 
    t->display(); 
    delete t; 
} 

は今、このプログラムをexectuingに私は新しい宣言し、クラス内で一度だけ演算子オーバーロードを削除する場合は3回

と呼ばれる新しいが3回と呼ばれ、削除されていることを見ています新しいものを呼び出すと削除が起こっています。

この流れが起こっている理由とこの流れの背後にある理由は、私を助けてくれる人もいます。

+0

あなたの問題は何ですか?それは事実であり、あなたがメインで一度だけ新しい自分を使用しているときに、削除は3回呼び出されますか? – Isuka

+0

問題は3回の呼び出しが起こっている理由です。このオペレータがクラス内でオーバーロードを宣言すると、1回のみ発生します。 – user5794230

+0

あなたの質問にはイメージを避けてください。あなたのイメージにはテキストが含まれています。フォーマットされたテキストとして表示されます(各行の先頭に4つのスペースがあります)。また、すべての警告とデバッグ情報( 'g ++ -Wall -Wextra -g'と[GCC](http://gcc.gnu.org/))でコードをコンパイルしてください。デバッガでステップバイステップで実行します。良いC++プログラミングの本を読むのに一週間かかる。 –

答えて

7

std::stringは最終的にグローバルoperator newを使用します。あなたは2つのstd::stringを作成しています。

1

あなたは新しいが、この場合には複数回呼び出すことがしたくない場合は、お使いのベースクラスでnew演算子をオーバーライドする必要があります。

class CBaseTest 
{ 
public: 
    void *operator new(const size_t allocation_size) 
    { 
     cout<<"\n\nMy new invoked:\n"; 
     return ::malloc(allocation_size); 
    } 

    void operator delete(void *block_of_memory) 
    { 
     cout<<"\n\nMy delete invoked:\n"; 
     ::free(block_of_memory); 
    } 
}; 

class test : public CBaseTest 
{ 
public: 
    int age; 
    string name; 

    test(string str, int a) 
    { 
     age = a; 
     name = str; 
    } 
    void display(); 
}; 

void test::display() 
{ 
    cout << "\n\nname is:-" << name << " and age is :- " << age << endl; 
} 

ここ

test *t = new test("sanjeev", 29); 

はあなたの新しいメソッドを呼び出します。

同様に、

delete t; 

はあなたのクラスのテストやCBaseTestから派生したクラスのための新しいを使用してメモリを割り当てるしようとした場合、あなたの新しいが呼び出されます、今すぐあなたのdeleteメソッド

を呼び出します。

関連する問題