C ++ удалить объект - PullRequest
       28

C ++ удалить объект

4 голосов
/ 29 ноября 2011

У меня нет опыта работы с памятью в программе на C ++, поэтому я хотел бы получить совет в этом случае:

Я хочу создать new Object в функции в классе, которыйнеобходимо до конца программы.Насколько мне известно, если я использую оператор new, мне иногда следует его удалить.Учитывая, что он должен быть инициализирован внутри класса, когда и как мне его окончательно удалить?

Ответы [ 4 ]

5 голосов
/ 29 ноября 2011

Я предлагаю идиома умного указателя

#include <memory>

struct X 
{
     void foo() { }
};

std::share_ptr<X> makeX() // could also be a class member of course
{
    return std::make_shared<X>();
}

int main()
{
     std::share_ptr<X> stayaround = makeX();

     // can just be used like an ordinary pointer:

     stayaround->foo();

     // auto-deletes <sup>1</sup>
}

Если указатель действительно является статической переменной, вы можете заменить unique_ptr (который работает аналогично, но передает владение при назначенииэто означает, что указатель не должен хранить счетчик ссылок )

Примечание Чтобы узнать больше о интеллектуальных указателях C ++ в целомсм. поясненные интеллектуальные указатели (повышение)

Примечание Если у вас нет TR1 / C ++ 0x поддержка для этого, вы можете просто использовать Boost Smartpointer


1 , если вы не утечка копий самого shared_ptr;это было бы какое-то странное использование умных указателей, ранее невиданных:)

2 голосов
/ 29 ноября 2011

Вы можете использовать умный указатель, как предлагает Sehe, или вы можете создать статический объект в функции и вернуть ссылку на него.Вам не нужно явно удалять объект, когда процесс завершается, объект будет удален.Нравится:

struct X {};

X& makeX() // could also be a class member of course
{
    static X x;
    return x;
}

int main()
{
     X& stayaround = makeX();
}
1 голос
/ 29 ноября 2011

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

Если вы хотите, чтобы объект в классе сохранялся до конца программы, вы можете просто сделать его переменной-членом. Из того, что вы сказали, нет ничего, что могло бы предложить вам использовать new или delete здесь, просто сделайте это автоматической переменной. Если вы хотите использовать new и delete для практики, вы должны прочитать о конструкторах и деструкторах для класса (вы можете и будете использовать new и delete вне занятий, но я стараюсь, чтобы это было актуально для вашего вопроса). Вот тот, который я подготовил ранее:

class Foo
{
    public:
        Foo();  // Default constructor.
        ~Foo(); // Destructor.

    private:
        int *member;
}

Foo::Foo() // Default constructor definition.
{
    member = new int; // Creating a new int on the heap.
}

Foo::~Foo() // Destructor.
{
    delete member; // Free up the memory that was allocated in the constructor.
}

Это простой пример, но, надеюсь, он вам поможет. Обратите внимание, что переменная будет сохраняться только до тех пор, пока объект жив. Если объект уничтожен или выходит из области видимости, будет вызван деструктор и память будет освобождена.

0 голосов
/ 29 ноября 2011

В большинстве операционных систем (в частности, в Linux), если вы выделяете указатель объекта с помощью new Object и не беспокоитесь о delete, потому что он понадобится до завершения программы, никакого вреда на самом деле не будет , Внутри вашей программы есть утечка памяти (вы можете использовать valgrind для поиска таких утечек), но ядро ​​освободит всю память, используемую процессом, когда он завершится.

Лучшая альтернатива - иметь одноэлементный класс для данных приложения, например, например. QApplication в Qt, давайте создадим один экземпляр в этом классе в начале вашего main, и пусть этот класс будет содержать умный или тупой указатель на ваш Object. Деструктор должен delete этот объект.

...