В этом обсуждении What and where are the stack and heap? Я узнал, что типы значений хранятся в стеке и указатели на куче. В моем приложении у меня есть некоторые QList<T*>
и QMap<QString,QList<QString>>
, содержащие указатели некоторых объектов.Сохранение ссылочных типов в типизированном списке значений?
Теперь я знаю, что ссылочные типы хранятся в куче (приложении). Но мои списки, содержащие эти ссылки, являются типами значений, и поэтому они находятся в стеке. Они доступны только в потоке, в котором они были созданы. Но откуда я знаю, когда поток будет мертв, или если функция/метод, которую я вызываю, находится в другом потоке? Мне нужны списки во всем приложении. Это немного глупый вопрос, но я заполняю свои списки, и это простой шанс, если объекты доступны.
EDIT:
@ coyotte508
Единственное, что в стеке указатели члены, указывающие, что памяти. Иными словами, если они были созданы в стеке, то есть только , если они являются локальными переменными функции или другого класса, объявленного в стеке.
В моем главном классе у меня есть список: QList<Fachbereich *> lFBs;
В конструктор моего основного класса я создаю список:
lFBs=QList<Fachbereich *>();
..- Тогда я вызываю метод ReadConfig();
Одна из подпрограмм:
void AppConfig::ReadFachbereiche(QXmlStreamReader &reader)
{
Fachbereich* fb(0);
while(!reader.atEnd())
{
reader.readNext();
if (reader.error())
{
bla bla
}
else
{
if (reader.isStartElement())
{
if (reader.name().toString().toLower() == "fb")
{
QString sFB="";
try{ sFB=reader.attributes().value("name").toString();}
catch(...){}
if (sFB !="")
{
fb=new Fachbereich();
fb->Name=sFB;
}
}
else if (reader.name().toString().toLower() == "stddir")
{
if (fb!=0) fb->stdDir=reader.readElementText().replace("\\", "/").toLower();
}
}
else if (reader.isEndElement())
{
if (reader.name().toString().toLower() == "fb")
{
if (fb!=0){
if (!lFBs.contains(fb))
lFBs.append(fb);
}
}
else if (reader.name().toString().toLower() == "fachbereiche") return;
}
}
}
}
Таким образом, fb
является локальной переменной этой функции. Я думал, создав объект с new
, память будет выделена в куче, но это не так. Новый, созданный, к моим спискам возвращаемых ссылочных типов исчезает при выходе из функции.
Должен ли я хранить объекты в QSharedPointer
? Ст. как это?
QList<QSharedPointer> lFBs;
...
QSharedPointer<Fachbereich> fb= QSharedPointer<Fachbereich>(new Fachbereich);
Большое спасибо за внимание к моей проблеме. Подумайте, я использовал ссылочные типы, потому что я хочу знать, если объекты инициализированы. Теперь я принимаю ваш совет, и он отлично работает :) –