COFF не сохраняет размеры массивов. Значение, связанное с символом массива, является его начальным адресом. Чтобы вывести размер массива dumpbin
, необходимо использовать некоторую эвристику, например, глядя на соседние символы, конец раздела и т. д. По-видимому, эвристический сбой. Только компилятор знает, почему BSS больше, чем можно было ожидать.
Возвратите адрес вещи, на которую указывает итератор:
&(*iterator)
Редактирование: Для разрешения некоторого беспорядка:
vector <int> vec; // a global vector of ints
void f() {
vec.push_back( 1 ); // add to the global vector
vector <int>::iterator it = vec.begin();
* it = 2; // change what was 1 to 2
int * p = &(*it); // get pointer to first element
* p = 3; // change what was 2 to 3
}
Никакая потребность в векторах указателей или динамического выделения.
Возврат & итератор возвратит адрес итератора. Если Вы хотите возвратиться, способ относиться к элементу возвращают сам итератор.
Остерегаются этого, Вам не нужен вектор, чтобы быть глобальным для возврата итератора/указателя, но этого, операции в векторе могут делать недействительным итератор. Добавление элементов к вектору, например, может переместить векторные элементы в другое положение, если новый размер () больше, чем зарезервированная память. Удаление элемента перед данным объектом от вектора заставит итератор относиться к другому элементу.
В обоих случаях, в зависимости от реализации STL может быть трудно отладить только с случайными ошибками, происходящими каждый так часто.
РЕДАКТИРОВАНИЕ после комментария: 'да, я не хотел возвращать итератор a) потому что его константа и b) конечно, это - только локальный, временный итератор? †“Krakkos
Итераторы не являются более или менее локальными или временными, чем какая-либо другая переменная, и они copyable. Можно возвратить его, и компилятор сделает копию для Вас, поскольку это будет с указателем.
Теперь с мысом константы. Если вызывающая сторона хочет выполнить модификации через возвращенный элемент (или указатель или итератор) тогда, необходимо использовать итератор неконстанты. (Просто удалите 'константу _' из определения итератора).
Это не хорошая идея возвратить итераторы. Итераторы становятся недопустимыми, когда модификации к вектору (inversion\deletion) происходят. Кроме того, итератор является локальным объектом, созданным на стеке, и следовательно возврат адреса того же нисколько не безопасен. Я предложил бы, чтобы Вы работали с myObject, а не векторными итераторами.
РЕДАКТИРОВАНИЕ: , Если объект легок тогда лучше, Вы возвращаете сам объект. Otheriwise возвращают указатели на myObject, сохраненный в векторе.
Пока Ваш вектор остается в глобальной области видимости, которую можно возвратить:
&(*iterator)
я предостерегу Вас, что это довольно опасно в целом. Если Ваш вектор когда-либо перемещается из глобальной области видимости и разрушен, любые указатели на myObject становятся недопустимыми. Если Вы пишете эти функции, поскольку часть большего проекта, возвращая указатель неконстанты могла привести кого-то удалять возвращаемое значение. Это будет иметь неопределенные, и катастрофические, эффекты на приложение.
я переписал бы это как:
myObject myFunction(const vector<myObject>& objects)
{
// find the object in question and return a copy
return *iterator;
}
, Если необходимо изменить возвращенный myObject, сохраните значения как указатели и выделите их на "куче":
myObject* myFunction(const vector<myObject*>& objects)
{
return *iterator;
}
Тот способ, которым Вы управляете, когда они разрушены.
Что-то вроде этого повредит Ваше приложение:
g_vector<tmpClass> myVector;
tmpClass t;
t.i = 30;
myVector.push_back(t);
// my function returns a pointer to a value in myVector
std::auto_ptr<tmpClass> t2(myFunction());
Скажите, у Вас есть следующее:
std::vector<myObject>::const_iterator first = vObj.begin();
Тогда первый объект в векторе: *first
. Для получения адреса используйте: &(*first)
.
Однако в соответствии с дизайном STL, я предложил бы, возвращают итератор вместо этого, если Вы планируете раздать его позже к алгоритмам STL.
Вы храните копии myObject в векторе. Таким образом, я полагаю, что копирование экземпляра myObject не является дорогостоящей операцией. Тогда я думаю, что самым безопасным был бы возврат копия myObject от Вашей функции.