2010-09-30 3 views
2

У меня есть ситуация, как показано ниже, в которой у меня есть проблема в освобождении памяти. В основном у меня есть вектор, который содержит указатель на объекты из класса А. У меня есть другой класс B, который хранит указатель класса A от вектора. Он будет использовать objB. Проблема в том, что мне нужно управлять вектором, чтобы стереть указатель.Управление памятью на C++ с использованием обычного указателя

Итак, как я могу освободить память objA, как в описании ниже?

  1. передать по значению objA и сделать копию в objB?

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

    vectorA < классA *> В.Т.; .... хранение множественного указателя на объекты в вектор

    ClassB * objB = новые ClassB (vt.at (поз));.

    какая-то логика выполняется Если оно выполнено, нужно стереть конкретный объект из вектора.

    vt.erase (pos); ==> как освободить память, если я удалю указатель здесь ? Я не мог назвать delete здесь, потому что objB может понадобиться позже использовать objA.

    классB :: классB (классA * objA) { this-> objA = objA; }

Так есть ли способ, чтобы освободить память, используя обычный указатель, как в описанном выше случае? Как некоторые из ответов направили меня на использование умного указателя, мой вопрос в том, есть ли какой-либо штраф за выполнение с помощью умного указателя? (например, индефинистический сборщик мусора C# на самом деле не идеален для высокопроизводительного приложения).

+6

[Использовать интеллектуальные указатели и RAII.] (Http://stackoverflow.com/questions/3681455/what-is-the-philosophy-of-managing-memory-in-c/3681471#3681471). Тогда вы не знаете, я должен беспокоиться о том, как управлять вещами самостоятельно. Действительно, это намного, намного, намного проще и гораздо меньше подвержено ошибкам. –

ответ

7

По крайней мере, небрежно, похоже, что вы ищете shared_ptr.

+0

Спасибо за ответ. Значит, у меня нет способа справиться с этим нормальным указателем? Это потому, что векторный класс с нормальным указателем уже используется и используется ... Я просто пытаюсь расширить код ... – Steveng

+0

Это можно сделать с помощью необработанного указателя, но вы, вероятно, собираетесь в конечном итоге имитировать большую часть функциональности shared_ptr (или что-то в этом порядке) к тому времени, когда вы заработаете правильно. –

1

Там должно быть одного владельца из A объектов, либо vt или objB.

Моя склонность к первому.

Классы как objB, которые хотят использовать A * можно использовать в качестве vt.at(pos) как вы упомянули, но они должны не держать копию A *.

+0

Существуют ситуации, когда вам требуется совместное владение, и для этого используется 'shared_ptr <>'. –

0

Если у вас есть Visual Studio 2008 SP1 или более поздняя версия, вы можете использовать std::tr1::shared_ptr. Если вы этого не сделаете, вы можете использовать boost::shared_ptr (тот же класс).

Сохраните shared_ptr в вашем векторе, тогда вам не нужно беспокоиться об освобождении памяти.

0

Как уже указывали другие, возможно, перед тем, как вы изменили свой вопрос, shared_ptr звучит как хорошая идея для вектора.Возможно, вы захотите также использовать weak_ptr в ссылке на класс B, чтобы вектор контролировал время жизни (класс B должен был бы иметь возможность обрабатывать, когда weak_ptr устарел).

Для освобождения, по умолчанию shared_ptr удаляет, когда счетчик ссылок равен 0. Вы можете указать пользовательский делектор для вашего shared_ptr, который дает больший контроль над тем, что на самом деле происходит. Просмотрите delayed deallocation technique для Boost shared_ptrs.

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