2012-01-19 3 views
-1

Ниже приведен эскиз того, как я мог бы иметь некоторую форму автоматизированного управления памятью в C++:C Управление памятью

template<class T> 
class Ptr{ 
public: 
    /* Some memory management stuff (ref counting etc.) 
    as Ptr object is initialized */ 
    Ptr(...) { .. } 

    /* Manage reference counts etc. 
    as Ptr object is copied -- might be necessary 
    when Ptr is passed to or returned from functions */ 
    Ptr<T>& operator=(..) { .. }; 

    /* Do memory management stuff 
     when this "Pointer" object is destroyed. */ 
    ~Ptr() { .. } 

private: 
    /* Pointer to main object */ 
    T* object; 
} 

class Obj{ 
public: 
    static Ptr<Obj> newObj(..) { return Ptr<Obj>(new Obj(..)); } 
private: 
    /* Hide constructor so it can only be created by newObj */ 
    Obj(..) { .. } 
    /* some variables for memory management routines */ 
    int refcnt; 
    .. 
} 

Таким образом, конечный пользователь не должен вызывать новые или таНос, и может вместо вызовите Obj.newObj (..).

Однако я довольно озадачен о том, как я мог бы сделать что-то подобное для C.

Это не должно быть так же, как и выше, но я не хочу, чтобы заботиться об управлении памяти, когда это не важно.

Самая большая проблема, которую я чувствую, заключается в том, что когда переменная в C выходит из области видимости, у меня действительно нет деструктора, который может быть сигнализирован, чтобы сообщить мне, что переменная вышла за рамки.

+5

Почему вы создаете свои собственные умные указатели? – delnan

+4

Если вам нужны интеллектуальные указатели, вы не должны использовать C. – Pubby

ответ

1

Полное решение и ответ на ваш вопрос см. GObject.

+0

Не могли бы вы объяснить, как GObject решает проблему ручного управления памятью? Страница wikipedia, с которой вы связаны, не дает понять. –

+0

Не могли бы вы объяснить, что именно вы подразумеваете под «ручным» управлением? –

+0

Я имею в виду то, что описано в вопросе: «Это не должно быть точно так же, как и выше, но я не хочу заботиться об управлении памятью, когда это не важно». (акцент мой). –

2

Да, это основное преимущество C++. Вы можете создавать классы, которые инкапсулируют функциональность. И эта функциональность может включать в себя конструкторы и деструкторы, чтобы гарантировать, что данные создаются, управляются и уничтожаются контролируемым образом.

В C нет такой опции, если вы не реализуете всю инфраструктуру, поддерживающую такую ​​опцию.

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