Как узнать, создание объекта в куче или нет ..? - PullRequest
4 голосов
/ 19 декабря 2010

Мы хотим работать в системе с низкой задержкой, выделение кучи в приложении обходится дороже.но в некоторой степени создание объекта в куче разрешено.Вот почему мы хотим указать, находится ли объект в куче или нет ..?

Является ли приведенная ниже методология правильным способом определения объекта, созданного в памяти кучи ..?

Будет иметь универсальный класс, в котором оператор new и delete перегружен для поддержкивыделенные кучи указатели ....

#include <iostream>
#include <set>

using namespace std;

class MemStat              //base class
{
    typedef set<MemStat*> POINTERS; 
    static POINTERS m_ptrlist;
public:
    void* operator new (size_t size)
    {
        MemStat* ptr = ::new MemStat;
        m_ptrlist.insert(ptr);
        return ptr;
    }
    void operator delete(void* dptr)
    {
        MemStat* ptr = static_cast<MemStat*>(dptr);
        m_ptrlist.erase(ptr);
        ::delete ptr;
    }
    // void* operator new[] (size_t sz);
    // void operator delete[] (void*);

    bool is_on_heap() { m_ptrlist.find(this) != m_ptrlist.end(); }

protected:             // ctor & dtor are protected for restrictions
    MemStat() { }
    virtual ~MemStat() { }
    MemStat(const MemStat&) { } 
    const MemStat& operator=(const MemStat& ) { return *this; }
};
MemStat::POINTERS MemStat::m_ptrlist;

для классов конечного пользователя, которые нам нужно проверить для создания кучи, будут получены из класса MemStat, использующего вызов оператора new & delete при создании экземпляра объекта базового класса.

class MyClass : public MemStat   //end user class
{
};

int main()
{
    MyClass* myptr = new MyClass;
    MyClass obj;

    cout << myptr->is_on_heap() << endl;    //results into yes
    cout << obj.is_on_heap() << endl;       //reults into no

    delete myptr;
}

1 Ответ

6 голосов
/ 19 декабря 2010

Обратите внимание, что ваша схема с треском проваливается, как только объект MyClass является подобъектом (наследуемым или содержащим) другого объекта, который может или не может быть выделен динамически. (И уловки, которые я знаю для предотвращения динамического выделения, также терпят неудачу.)

Так что то, что вы делаете, еще больше замедляет выделение кучи без особого выигрыша. За исключением нескольких очень редких случаев, когда объект распределяется - это то, что решает ваш класс * пользователей .
Если они думают, что им нужно динамически выделить кого-то, с кем вы не согласны?

...