Создать карту указателей на объекты в списке? - PullRequest
0 голосов
/ 06 июня 2011

Пытаясь исправить утечки памяти, помимо прочего, в стороннем проекте, я полностью запутал себя указателями, списками, картами, памятью и т. Д.

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

Возможно ли это?

Я работал над тестовым кодом, который выглядит следующим образом:

list<cObject> mylist;
map<int, ciEntity*> mymap;

void main(void)
{
    int x = 0;
    class cObject *temp;

    for(x = 0; x < 10; x++)
    {
        temp = new cObject;
        temp->name = new char[25];
        strcpy(temp->name, "Test");
        temp->id=x;
        mylist.push_back(*temp);
        // now what with the map?
        delete temp;
    }

}  

У меня были и другие идеи, которые слишком возились с объявлением карты.Я попытался использовать iter для просмотра списка, а затем mymap [id] = iter или аналогичные варианты.У меня была нулевая удача заставить что-либо работать.Я знаю, что мои основы не там, где они должны быть в отношении работы с памятью.Любая помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Я бы немного изменил это и использовал бы что-то вроде std::shared_ptr<cObject> и в вашем списке, и на вашей карте.Для карты вы можете использовать либо int, либо, возможно, std::string для типа ключа, а затем для типа значения используйте std::shared_ptr<cObject>

Так ваш код будет выглядетьбольше похоже на:

using namespace std;

list<shared_ptr<cObject> > mylist;
map<int, shared_ptr<cObject> > mymap;

void main(void)
{
    int x = 0;

    for(x = 0; x < 10; x++)
    {
        std::shared_ptr<cObject> temp = shared_ptr(new cObject);
        temp->name = new char[25];
        strcpy(temp->name, "Test");
        temp->id=x;
        mylist.push_back(temp);

        // now what with the map?
        mymap[x] = temp;

        //no need to delete temp since it's a managed pointer-type
    }

}

Если по какой-то причине у вашего компилятора нет std::shared_ptr, вы также можете получить его из Boost.

Хорошая вещь с этим подходом - ваш списоки карта теперь указывают на один и тот же объект, поэтому, если вы измените объект в списке, изменения также будут отражены на карте.Кроме того, объект shared_ptr будет управлять временем жизни указателя путем подсчета ссылок, поэтому, как только ссылки на указатель перестанут существовать, он будет вызывать delete для указателя без необходимости беспокоиться об очистке указателей откаждый контейнер (и избегая вопросов владения указателями).

0 голосов
/ 06 июня 2011

Вам не нужны и список, и карта.Карты поддерживают итерацию во многом так же, как и списки, поэтому вы можете получить доступ к значениям на карте как быстро, с помощью ключа, так и медленно с помощью итерации.Я также сомневаюсь, почему вы создаете вещи, используя new - массив char, вероятно, должен быть std :: string, а сами объекты, вероятно, должны быть значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...