2017-09-08 1 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; 
} 

이제 내가 새가 3 회

내가 새로운 선언하고 클래스를 한 번만 내에서 연산자 오버로딩을 삭제하는 경우라고 3 번 호출 및 삭제되는 것을보고하고이 프로그램을 exectuing에 새 전화를 걸고 삭제가 진행 중입니다.

나를 도울 수있는 이유는 무엇입니까? 왜이 흐름이 일어나고 있으며,이 흐름 뒤에 이유가 있습니다.

+0

그러면 지금 무슨 문제가 있습니까? 새로운 사실이며 delete는 메인에서 한 번만 새로운 것을 사용하고있을 때 세 번 호출됩니다. – Isuka

+0

문제는 3 번 호출이 발생하는 이유입니다. 한 번 발생해야합니다.이 연산자가 클래스 내부에 오버로드를 선언하면 한 번만 호출됩니다. – user5794230

+0

질문에 이미지를 사용하지 마십시오. 이미지에 텍스트가 포함되어 있으면 형식이 지정된 텍스트로 표시됩니다 (모든 행의 시작 부분에 4 개의 공백). 또한 모든 경고와 디버그 정보 ('g ++ -Wall -Wextra -g'와 함께 [GCC] (http://gcc.gnu.org/))로 코드를 컴파일하십시오. 디버거에서 단계별로 실행하십시오. 좋은 C++ 프로그래밍 책을 읽으려면 일주일이 걸릴 것입니다. –

답변

7

std::string은 궁극적으로 글로벌 operator new을 사용합니다. 두 개의 std::string을 생성 중입니다. 이 경우 여러 번 호출 할 새 원하지 않는 경우

1

당신은 당신의 기본 클래스에서 new 연산자를 오버라이드 (override) : 여기

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); 

새 메소드를 호출합니다. 당신이 다음 새가 호출됩니다 클래스 테스트 또는 CBaseTest에서 파생 된 모든 클래스에 대한 새로운 사용하여 메모리를 할당하려고하면

마찬가지로

,

delete t; 

이제 삭제 방법을 호출합니다.

관련 문제