c++ - 在值类型列表中保存引用类型?

标签 c++ qt pointers

在此讨论中 What and where are the stack and heap?我了解到值类型保存在堆栈中,指针保存在堆中。在我的应用程序中,我有一些 QList<T*>QMap<QString,QList<QString>>持有一些对象的指针。

现在我知道了,引用类型保存在堆(应用程序)中。但是我的列表,持有这个引用,是值类型,所以它们在堆栈中。它们仅在创建它们的线程中可用。但是我怎么知道线程什么时候会死,或者我调用的函数/方法是否在另一个线程中?我需要整个应用程序中的列表。这是一个有点愚蠢的问题,但我填写了我的列表,如果对象可用,这只是一个机会。

编辑:

@coyotte508

The only things in the stack are the member pointers pointing to that memory. And that is, if they were created in the stack, which is only if they're local variables of a function or of another class declared on the stack.

在我的主类中,我有一个列表: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);

最佳答案

您的代码与线程没有太多关系。

你想要的是保留 fb函数外的变量。

然后您将其添加到列表中,这很好。

if (reader.name().toString().toLower() == "fb")
{
    if (fb!=0){
        if (!lFBs.contains(fb))
            lFBs.append(fb);
    }
}
else if (reader.name().toString().toLower() == "fachbereiche") return;

但你只在某些情况下这样做,有时(当名字是“fachbereiche”时)你直接返回。我认为您甚至不需要将它放在指针中。 QList<Fachbereich>保存数据,因为它是你的类的成员,数据将被保存直到你的类被销毁。

我会做什么:

  • 停止使用指针或new .这取决于 Fachbereich 的创建方式,但应该不会造成问题
  • 确保在需要时始终将元素添加到列表中。

为此,在函数的开头:

Fachbereich fb;
bool somethingRead = false;

决定“创建”时fb ,只需将 bool 值设置为 true:

if (sFB !="")
{
    /* Maybe add a debugging message here to say it was created */
    somethingRead = true;
    fb.Name=sFB;
}

替换这段代码:

            if (reader.name().toString().toLower() == "fb")
            {
                if (fb!=0){
                    if (!lFBs.contains(fb))
                        lFBs.append(fb);
                }
            }
            else if (reader.name().toString().toLower() == "fachbereiche") return;

通过:

break; //leave the loop

最后,在函数的末尾,在循环之后:

/* The boolean is true if fb was initialized */
if (somethingRead) {
    lFb.push_back(fb);
}

然后调用函数后,lFb.size()你的类(class)应该超过 0 和 lFb.last()应该包含您的元素。

QList在使用 new 分配对象后在内部存储对象,因此您无需担心这一点。

关于c++ - 在值类型列表中保存引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37721810/

相关文章:

c++ - 加速器.cu(8) : error: attribute "managed" does not apply here?

c++ - Qt - 将 QString 路径保存到注册表中的 QSettings

c++ - QT5 和 Antlr4.8 不能用 Cmake 和 QT Creator 编译

c++ - qtimer 和 opencv 运行缓慢

pointers - 如何创建指向未确定大小类型的拥有指针?

c++ - 静态变量的地址值可以与堆分配地址匹配吗?

使用 "get"方法的 C++ 类继承

c++ - 使用另一个对象作为构造函数中的参数创建一个对象

c++ http tcp服务器到服务器连接

c - C中的双向链表