2010-01-06 8 views
0

동적으로 및 정적으로 인스턴스화 된 개체 번호를 찾으려고합니다. 변수 myheap이 선언되지 않은 오류가 발생합니다.정적 클래스 멤버 선언 오류

#include<iostream.h> 
#include<stdlib.h> 

class A { 
public: 
    static int x; //To count number of total objects. incremented in constructor 
    static int myheap; //To count number of heap objects. Incremented in overloaded new 

    void* operator new(size_t t) { 
    A *p; 
    p=(A*)malloc(t); 
    myheap++; 
    return p; 
    } 

    void operator delete(void *p) { 
    free(p); 
    myheap--; 
    } 

    A() { 
    x++; 
    } 

    ~A() { 
    x--; 
    } 
}; 
int A::x=0; 
int A::myheap=0; 

int main() { 
    A *g,*h,*i; 
    A a,c,b,d,e;//Static allocations 5 

    g= new A();//Dynamic allocations 3 
    h= new A(); 
    i= new A(); 

    cout<<"Total"<<A::x<<'\n'; 

    cout<<"Dynamic"; 
    cout<<'\n'<<"HEAP"<<A::myheap; 

    delete g; 
    cout<<'\n'<<"After delete g"<<A::x; 
    cout<<'\n'<<"HEAP"<<A::myheap; 
    delete h; 
    cout<<'\n'<<"After delete h"<<A::x; 
    cout<<'\n'<<"HEAP"<<A::myheap; 
    delete i; 
    cout<<'\n'<<"After delete i"<<A::x; 
    cout<<'\n'<<"HEAP"<<A::myheap; 
} 
+0

A를 myheap를 수정 후 :이 일 myheap. 코드와 그 작업을 업데이트했습니다. 모두 감사합니다. 내가 새것에서 p를 돌려주지 않을 때, 그것은 경고를 주었고 컴파일되었습니다. 그러나 실행에 코어 덤프를 주었다. 어떤 이유? – Sandeep

+0

요점 외에도 여전히 관련성이 높은 iostream & stdlib.h 대신 iostream & cstdlib 인 확장형 헤더 파일 버전을 사용하십시오. 후자는 C++ 프로젝트에서 사용하는 C 헤더 파일입니다. 헤더 이름 앞에 ac를 추가하여 C++ 헤더 파일을 제공하십시오. 여러분이 사용하고있는 것들은 구식이며, 여러분의 코드에서 오류를 철자하지는 않지만 현대 컴파일러에서 그리고 앞으로는 확실히 문제가 될 수 있습니다. 내가 무슨 뜻인지에 대한 자세한 설명은 http://members.gamedev.net/sicrane/articles/iostream.html – rocknroll

답변

0

코드가 거의 정확하지만 컴파일러가 이전 오류에 대해 혼란을 겪었 기 때문에 'myheap'에 대한 오류가 표시됩니다. 먼저 첫 번째 오류를 수정하십시오.

new 연산자에 과부하가 걸리면 간단한 malloc보다 더 많은 것이 있습니다. 도움이 될 previous example이 있지만 수업 관련 정보가 아닌 새로운 글로벌 정보입니다. 여기

은이 정리됩니다 (이 컴파일 및 실행)

#include <iostream> 
#include <memory> 
#include <new> 
#include <stdlib.h> 

struct A { 
    static int count; 
    static int heap_count; 
    void* operator new(std::size_t t) { 
    void* p = malloc(t); 
    if (!p) throw std::bad_alloc(); 
    heap_count++; 
    return p; 
    } 
    void operator delete(void *p) { 
    free(p); 
    heap_count--; 
    } 
    A() { 
    count++; 
    } 
    ~A() { 
    count--; 
    } 
}; 
int A::count = 0; 
int A::heap_count = 0; 

int main() { 
    using namespace std; 

    A a, b, c, d, e; 
    auto_ptr<A> g (new A), h (new A), i (new A); 

    cout << "Total: " << A::count << '\n'; 
    cout << "Dynamic\nHeap: " << A::heap_count << '\n'; 
    g.release(); 
    cout << "After delete g: " << A::heap_count << '\n'; 
    h.release(); 
    cout << "After delete h: " << A::heap_count << '\n'; 
    i.release(); 
    cout << "After delete i: " << A::heap_count << '\n'; 
    cout << "Heap: " << A::heap_count << '\n'; 

    return 0; 
} 
+0

알다시피, 나는 * 당신이 그 연결된 질문에 대한 OP 였음을 깨달았습니다. >< –

0

A::myheap이어야합니다.

또한 new 연산자는 생성자를 호출해야합니다. 맞아요, 새로 할당 된 객체에 포인터를 반환하면됩니다.

void * operator new(size_t t) 
{ 
A *p = (A*)malloc(t); 
myheap++; 
return p; 
} 
+0

Ohhhh .... 감사합니다 .... 놓친 .... – Sandeep

+0

new() need need new'd (p) 인 객체를 반환합니다. –

+0

Igor ... Constructor는 명시 적으로 암묵적으로 호출되므로 명시 적으로 호출되지 않습니다. – Sandeep

0

당신은 로컬이 myheap 이름이없는하지만 당신은 myheap라는 이름의 클래스 범위의 정적 변수가 않습니다. 따라서 A::myheap이 필요합니다. 하지만 실제로는 myheapx은 비공개이어야하며 static getx 및 static getmyheap public 메서드가 정의되어 있어야합니다. 물론, x은 더 나은 이름을 가져야합니다.

+0

@Roger Pate : 그는 '메인'에 대해서 이야기하고 있었는데, 그는 단순히 'myheap'('A :: myheap'대신에)이 있었는데, 그게 제가 언급 한 것입니다.그의 코드는 그 이후 편집이 완료되었는데,이 코드는 답변을 부적절하게 렌더링하고이 같은 혼란을 가져 오기 때문에 심하게 편집되었습니다. 그는 "myheap을 A :: myheap에 고정시킨 후에"나의 진술을 뒷받침 해 주었다. – jason

+0

아, 나는 그것이 편집되었다는 것을 놓쳤습니다. 사과. –

0

하기 Sandeep,

이유 새 반환되지 않은 페이지가 삭제 기능을가하려고하기 때문에 때 코어 덤프를 얻고 있었다 포인터를 전달하십시오.

새 값이 p를 리턴하지 않았으므로, delete()로 보내지는 값은 NULL이거나 초기화되지 않았습니다. 포인터가 NULL이거나 스택의 임의의 값을 사용하여 free를 호출하면 프로그램이 중단됩니다.

최저

,

관련 문제