Size: a a a

2020 April 07

a

aaalitvinov in Qt
Егор
он их в себя скопирует, какая разница где ты их создал
Поясните, что значит в себя? мне интересен момент его работы с памятью
источник

J

Jahrley in Qt
aaalitvinov
Скажите, есть я буду в QVector или любой другой контейнер складывать данные (объекты) созданные на стеке, QVector сам заботиться о выделении и освобождении памяти для принятого объекта?
Со стека оно удалится, только когда выйдешь из скоупа функции. Если элемент большой, можешь использовать std::move. Если не большой, просто работать в рамках маленьких скоупов.
источник

Е

Егор in Qt
aaalitvinov
Поясните, что значит в себя? мне интересен момент его работы с памятью
я не знаю как кувектор устроен, но по идее вектор внутри себя держит указатель на буффер + размер, и по мере надобности его расширяет. Когда ты создал объект и сделал пуш в вектор, он скопирует (ну или мувнет) его себе в буффер и дальше можно получить к нему доступ с помощью функций самого вектора. Весь контроль памяти забота класса а не юзера. За тонкостами по типу CoW в гугел
источник

a

aaalitvinov in Qt
Jahrley
Со стека оно удалится, только когда выйдешь из скоупа функции. Если элемент большой, можешь использовать std::move. Если не большой, просто работать в рамках маленьких скоупов.
В том то и вопрос. Стек по завершению функции очистился. Соответственно объекты создаются в куче внутри вектора?
источник

Е

Егор in Qt
aaalitvinov
В том то и вопрос. Стек по завершению функции очистился. Соответственно объекты создаются в куче внутри вектора?
Создать ты их можешь где хочешь, вектор будет хранить копию. Можешь мувнуть или создать внутри самого вектора (emplace) если нужно
источник

J

Jahrley in Qt
aaalitvinov
В том то и вопрос. Стек по завершению функции очистился. Соответственно объекты создаются в куче внутри вектора?
Куча она не внутри вектора. Вектор просто хранит указатель на созданный массив в куче. Если сам вектор ты создал на стеке, то при завершении скоупа он в деструкторе очистит память на куче. Если ты его создал где-то снаружи и просто используешь его, то скопированные элементы останутся на куче.
источник

a

aaalitvinov in Qt
Не, вектор у меня мембер, а данные я создаю на стеке. И кладу их вектор.
источник

J

Jahrley in Qt
aaalitvinov
Не, вектор у меня мембер, а данные я создаю на стеке. И кладу их вектор.
Значит они скопируются/переместятся/создадутся сразу внутри. На твой выбор.
источник

J

Jahrley in Qt
Вопрос уже решён, или я не понял его сути?
источник

Е

Егор in Qt
aaalitvinov
Не, вектор у меня мембер, а данные я создаю на стеке. И кладу их вектор.
QVector<MyClass> a;
MyClass object;
a.push_back(object);
assert(&a[0] != &object);
источник

a

aaalitvinov in Qt
Ну т.е. выделение и освобождение памяти лежит на векторе?
источник

Е

Егор in Qt
aaalitvinov
Ну т.е. выделение и освобождение памяти лежит на векторе?
да
источник

J

Jahrley in Qt
aaalitvinov
Ну т.е. выделение и освобождение памяти лежит на векторе?
Естественно
источник

a

aaalitvinov in Qt
А когда я беру из вектора элемент, он мне его копию дает?
источник

J

Jahrley in Qt
Да. Для этого можешь просто посмотреть сигнатуру оператора в документации
источник

J

Jahrley in Qt
Если по значению, значит копия
источник

J

Jahrley in Qt
Можешь, конечно, брать .data() (указатель на начало массива из вектора), а потом двигать указатель. Но то уже какое-то крайне сомнительное фехтование с неизвестными целями.
источник

Е

Егор in Qt
Jahrley
Можешь, конечно, брать .data() (указатель на начало массива из вектора), а потом двигать указатель. Но то уже какое-то крайне сомнительное фехтование с неизвестными целями.
выдешь за сайз и нога прострелена
источник

J

Jahrley in Qt
Естественно
источник

a

aaalitvinov in Qt
Благодарю.
источник