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

+0

Помимо точки, но по-прежнему очень актуальной, используйте версию файла без заголовка, то есть iostream & cstdlib вместо iostream.h & stdlib.h, последний файл заголовка C, который вы используете в проекте C++, для этого удалите .h и добавьте ac перед заголовком, чтобы дать вам заголовочный файл C++. Те, которые вы используете, являются архаичными, и хотя они могут не указывать на ошибки в коде, а на современных компиляторах, и в будущем определенно может быть проблемой. Для полного объяснения того, что я имею в виду, обратитесь к этой статье http://members.gamedev.net/sicrane/articles/iostream.html – rocknroll

ответ

0

Ваш код почти прав, но вы видите ошибки в «myheap», потому что компилятор был смущен более ранними ошибками. Сначала исправьте первую ошибку.

О перегрузке нового оператора, есть больше, чем простой 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

Вы знаете, я * просто * понял, что вы были ОП по этому связанному вопросу. >< – 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

+0

new() также необходимо для возврата объекта new'd (p). –

+0

Igor ... Я думаю, что конструктор не называется явно, так как он называется неявно. – Sandeep

0

Вы не местный названный myheap, но у вас есть класс в области видимости статической переменной с именем myheap. Таким образом, вам нужно A::myheap. Но действительно, myheap и x должны быть частными, и вы должны иметь статические getx и статические getmyheap общедоступные методы. И, конечно же, у x должно быть лучшее имя.

+0

@Roger Pate: Он говорил об этом в 'main', где у него просто был' myheap' (вместо 'A :: myheap'), и это то, о чем я говорил.С тех пор его код был отредактирован, что сильно не соответствует действительности, поскольку оно делает нерелевантные ответы и приводит к путаницам, таким как этот. Обратите внимание, что он оставил комментарий к своему вопросу «После исправления« myheap »до« A :: myheap »он работал», поддерживая мои заявления здесь. – jason

+0

Ах, я пропустил, что он был отредактирован. Извиняюсь. – 2010-01-06 04:35:27

0

Sandeep,

Причина вы получаете дамп, когда новый не возвращался р, потому что ваша функция удаления пытается освободите указатель, который вы передаете.

Поскольку new не возвращал p, значение, отправляемое для удаления(), равно NULL или не инициализировано. Вызов без указателя с NULL или случайным значением из стека приведет к сбою вашей программы.

Бест,

Сэм

Смежные вопросы