Контейнеры C ++ на классах, возвращающие указатели - PullRequest
0 голосов
/ 17 апреля 2010

У меня возникли проблемы с поиском наилучшего способа достичь того, что я имею в виду, из-за моей неопытности. У меня есть класс, где мне нужен вектор объектов. Итак, мой первый вопрос будет:

  • есть ли проблема с этим: vector контейнер * и затем в конструкторе инициализировать его с новым (и удалить его в деструкторе)?

Другой вопрос: если этот вектор будет хранить объекты, не должен ли он быть больше похож на vector , чтобы они могли быть созданы динамически? В таком случае, как мне вернуть объект из метода и как избежать утечек памяти (пытаясь использовать только STL)?

Ответы [ 3 ]

1 голос
/ 17 апреля 2010

Не используйте new и удаляйте ничего.

Иногда вам нужно, но обычно это не так, поэтому старайтесь избегать этого и посмотрите, как вы справляетесь. Трудно объяснить, как именно без более конкретного примера, но, в частности, если вы делаете:

SomeType *myobject = new SomeType();
... use myobject for something ...
delete myobject;
return;

Тогда, во-первых, этот код подвержен утечкам, а во-вторых, его следует заменить на:

SomeType myobject;
... use myobject for something (replacing -> with . etc.) ...
return;

Особенно не создавайте вектор с новым - это почти всегда неправильно, потому что на практике вектор почти всегда имеет одного четко определенного владельца. У этого владельца должна быть переменная vector , а не указатель на вектор, который он должен запомнить, чтобы удалить. Вы не будете динамически выделять int просто как счетчик циклов, и вы не будете динамически выделять вектор только для хранения некоторых значений. В C ++ все типы могут вести себя во многом как встроенные типы. Проблема заключается в том, какой срок службы вы хотите, чтобы они имели, и (иногда), стоит ли передавать их по значению или иным образом копировать.

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

Только если их нужно динамически создавать по какой-то другой причине, кроме того, что вы хотите организовать их в векторе. Пока вы не дойдете до этой причины, не ищите ее.

В таком случае, как мне вернуть объект из метода и как избежать утечек памяти (пытаясь использовать только STL)?

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

1 голос
/ 17 апреля 2010

есть ли проблема с этим: vector * контейнер и затем в конструкторе инициализируйте его с новым (и удаляя его в деструкторе)

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

Просто сделайте вектор членом класса:

class foo
{
    std::vector<AnyType> container;
    ...
}

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

1 голос
/ 17 апреля 2010

Да, вы можете сделать vector<AnyType> *container и новый / удалить его. Просто будьте осторожны, когда вы делаете нижнюю запись для доступа к ее элементам; не забудьте сказать (*container)[i], а не container[i] или, что хуже, *container[i], что, вероятно, скомпилирует и приведет к сбою.

Когда вы делаете vector<AnyType>, конструкторы / деструкторы вызываются автоматически по мере необходимости. Однако такой подход может привести к нежелательному копированию объектов, если вы планируете передавать объекты. Хотя vector<AnyType> обеспечивает лучший синтаксический сахар для наиболее очевидных операций, я рекомендую vector<AnyType*> для непримитивных объектов просто потому, что он более гибкий.

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