Вот еще один ответ (возможно, я должен был отредактировать первый, но поскольку у него другой фокус, я подумал, что было бы нормально их разделить).
При создании указателя с new
память для него зарезервирована и сохраняется до тех пор, пока вы не назовете на нем delete
, но срок службы идентификатора все еще ограничен концом блока кода. Если вы создаете объекты в функции и добавляете их во внешний список, объекты могут оставаться в памяти в памяти после возвращения функции и вы можете ссылаться на них без идентификатора.
Вот (упрощенный) пример из Umbra, рамки C++, которую я разрабатываю. В модуле содержится список модулей (указателей на объекты).Двигатель может добавить объект к этому списку:
void UmbraEngine::addModule (UmbraModule * module) {
modules.push(module);
module->id = modules.size() - 1;
}
Получить один:
UmbraModule * UmbraEngine::getModule (int id) {
for (UmbraModule **it=modules.begin(); it != modules.end(); it++) {
if ((*it)->id == id) return *it;
}
}
Теперь я могу добавить и получить модули не зная их идентификаторы:
int main() {
UmbraEngine e;
for (int i = 0; i < 10; i++) {
e.addModule(new UmbraModule());
}
UmbraModule * m = e.getModule(5); //OK
cout << m << endl; //"0x127f10" or whatever
for (int j = 0; k < 10; j++) {
UmbraModule mm; //not a pointer
e.addModule(&mm);
}
m = e.getModule(15);
cout << m << endl; //{null}
}
модулей список сохраняется в течение всей продолжительности программы, мне не нужно заботиться о продолжительности жизни модулей, если они создаются с помощью new
:). Таким образом, это в основном это - с указателями вы можете иметь долгоживущие объекты, которым когда-либо не нужен идентификатор (или имя, если хотите), чтобы ссылаться на них :).
Другой хороший, но очень простой пример заключается в следующем:
void getVal (int * a) {
*a = 10;
}
int main() {
int b;
getVal(&b);
return b;
}
вам не нужно удалить сам указатель, а также ссылки автоматически не удалить объект ссылки. Вы уверены, что не путаете ссылки и ценности/объекты? – DaVinci 2010-11-26 19:29:48
Я очень уверен в различии между разницей между значением/ссылкой. Моя проблема заключается в том, когда объявлять объект как указатель на него и передавать указатель вдоль или объявлять как значение и передавать его ссылку. – rafaelxy 2010-11-26 19:32:01