2010-01-06 163 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

固定myheap至A後:: myheap它的工作。我更新了代碼及其工作。感謝所有 當我不是從新返回p時,它發出警告並編譯。但是在執行時給了核心轉儲。任何原因? – Sandeep 2010-01-06 04:30:40

+0

除了點但仍然非常相關,使用無擴展頭文件版本,即iostream&cstdlib而不是iostream.h&stdlib.h,後者是一個C頭文件,您在C++項目中使用,爲此刪除.h並在標題名稱前添加ac以爲您提供C++頭文件。你使用的是古老的,雖然它們可能不會在你的代碼中拼寫錯誤,但是在現代編譯器中,在將來肯定會成爲一個問題。有關我的意思請參閱此文章的完整說明http://members.gamedev.net/sicrane/articles/iostream.html – rocknroll 2010-01-06 09:37:00

回答

0

你的代碼幾乎是正確的,但你看到關於'myheap'的錯誤,因爲編譯器對早期錯誤感到困惑。首先解決第一個錯誤。

關於重載operator 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。 >< – 2010-01-06 05:05:39

0

它應該是A::myheap

另外,您的操作符new應調用構造函數: 您是對的,您只需將指針返回給新分配的對象。

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

Ohhhh ....謝謝....錯過了.... – Sandeep 2010-01-06 04:02:03

+0

new()還需要返回new'd(p)的對象。 – 2010-01-06 04:16:01

+0

Igor ...我認爲構造函數不會被明確調用,因爲它被隱式調用。 – Sandeep 2010-01-06 04:19:26

0

您沒有本地命名myheap但你有一個名爲myheap類範圍的靜態變量。因此您需要A::myheap。但實際上,myheapx應該是私有的,您應該定義一個靜態的getx和靜態的getmyheap公共方法。當然,x應該有更好的名字。

+0

@Roger Pate:他在'main'中談論的地方他只有'myheap'(而不是'A :: myheap'),這就是我所指的。他的代碼已經被編輯出來,這很不符合事實,因爲它使答案不相關,並導致諸如此類的混淆。請注意,他已對他的問題發表了評論:「將'myheap'修復爲'A :: myheap'後,它的工作」在此支持我的陳述。 – jason 2010-01-06 04:33:10

+0

啊,我錯過了它被編輯。道歉。 – 2010-01-06 04:35:27

0

桑迪普,

的原因,當新的是不返回p的,因爲你的刪除功能嘗試你得到一個核心轉儲釋放您通過的指針。

由於new沒有返回p,因此發送到delete()的值可能爲NULL或未初始化。使用空指針或堆棧中的隨機值進行免費調用會導致程序崩潰。

最佳,

山姆