LINUX.ORG.RU

хранение указателей на экземпляры класса


0

2

Добрый день! Может ли произойти перемещение памяти при хранении указателей на экземпляры класса в STL контейнере и операциях типо нижеследующих?

//объявление
Vector<MyClass *> t1;
Vector<MyClass *> t2;
Vector<MyClass *> t3;

//создание экземпляра
t1.pushback(new MyClass(...));

//перемещение между контейнерами
   //допустим
t3.pushback(t1[i]);
t1[i]=0; //

//удаление экземпляра
delete t2[i];
t2[i]=0;

//удаление нулевых указателей из вектора
t1.erase(std::remove(t1.begin(), t1.end(), static_cast<MyClass*>(0)), t1.end());
 

Указатель - это число, адресс в памяти. С чего двигаться памяти?

 t1[i]=0;
t1[i] = nullptr; // правильнее
 std::remove(t1.begin(), t1.end(), static_cast<MyClass*>(0))

соответственно

std::remove(t1.begin(), t1.end(), nullptr)

ps: use shared_ptr, Luke!

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 2)

Добрый день! Может ли произойти перемещение памяти при хранении указателей на экземпляры класса в STL контейнере и операциях типо нижеследующих?

Что значит «перемещение памяти»? Указатель он и есть указатель, по сути просто число определенной длины(в зависимости от платформы). Если скопируете элемент одного массива в другой, а потом обнулите первый элемент, то второй не изменится.

codeogre
()
Ответ на: комментарий от vromanov

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

а как начинаются, этого требует логика программы, операции с указателями, т.е. перемещение, зануление , очистка вектора от нулевых указателей, начинаются ошибки.

вот я и думаю, что причина в хранение указателей в векторе.

boriska503
() автор топика
Ответ на: комментарий от codeogre

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

boriska503
() автор топика
Ответ на: комментарий от boriska503

слежу сам и внимательно. везде по сто раз перепроверил

Может лучше пущай машина проверяет? А то вдруг стопервый раз не заметишь....

true_admin ★★★★★
()
Ответ на: комментарий от boriska503

А вообще избавиться от указателей не получается? Т.е. хранить в статической памяти.

vromanov ★★
()
Ответ на: комментарий от boriska503

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

Также непонятно зачем ты используешь remove внутри erase.

codeogre
()
Ответ на: комментарий от codeogre

Также непонятно зачем ты используешь remove внутри erase.

хотя нет, понятно, чтобы выровнять размер вектора.

codeogre
()
Ответ на: комментарий от codeogre

Также непонятно зачем ты используешь remove внутри erase.

ну задача удалить из вектора зануленные указатели. а как нужно?

boriska503
() автор топика
Ответ на: комментарий от boriska503

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

vromanov ★★
()
Ответ на: комментарий от boriska503

Зависот данных и какие операции в с ними хотите делать. Например, списки, множества или даже просто массив указателей.

У нас, напрмиер, используются массивы фиксированного размера. А вместо указателя хранится номер элемента в массиве.

vromanov ★★
()
Ответ на: комментарий от vromanov

или даже просто массив указателей.

Ну и чем он отличается от вектора? :) Удаление одного элемента из вектора делается просто (в случае, если порядок не имеет значения):

v[idx] = v.back();
v.resize(v.size() - 1);
где idx - индекс удаляемого элемента.

Или без ресайза, если хранить количество элементов вне вектора.

andreyu ★★★★★
()
Ответ на: комментарий от vromanov

Это в том случае, если не важен порядок.

Именно так я и сказал :)

andreyu ★★★★★
()

нет, не может

Но если ты будешь заниматься такой ерундой, то обязательно пройдёшься по граблям. Впрочем, уже прошёлся, о чём немного выше самостоятельно доложил.

anonymous
()

Конечно ничего в памяти не перемещается, откуда такая бредовая идея? Сами указатели в контейнере - они перемещаются и, может быть, вы используете после этого недействительные итераторы?

no-such-file ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.