如何创建结构实例,当其超出范围时将不会被删除?

时间:2019-05-05 13:09:14

标签: c++ memory-management

我试图在C ++中创建一个自定义数据结构,类似于双链表。因此,在类构造函数中,我正在创建一个结构实例(请参见下面的代码),但是在更改范围时无法“保存”它。

我尝试用关键字new创建实例,但是当我使用调试器运行程序时,我看到在上一个作用域中创建的对象已被“优化”。

在先前的作用域中,我的意思是当我处于if循环的作用域中,然后输入另一个if语句时,似乎我在第一个语句中创建的实例消失了。

我不确定“优化”到底是什么意思。我正在使用CLion,这就是我更改范围时在调试器中显示的消息。

该结构的代码为:

struct singleLinkNode {
    int column;
    int data;
    singleLinkNode *nextSingleNode;
};

我的目标是创建一个保留在内存中的结构实例,直到我删除它或程序结束为止。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

“优化”是

  

编译器没有发现此变量的任何用途,因此它决定不需要此变量并将其从生成的程序集中删除

当代码开始使用此变量(即对其进行读写)时,将不再对其进行优化。

或者,您可以关闭编译器优化(在gcc中,可以使用-O0标志来完成)。

正如Igor Tandetnik在评论中指出的那样,new关键字创建一个对象并将其放在堆上。该对象将一直存在,直到您调用delete或程序完成为止。
但是,编译器注意到从未使用过由new创建的指针,因此它优化了指针(可能是整个对象,但这是未知的)。

答案 1 :(得分:0)

您可以使用 freestore 内存,所以可以说您拥有class A

struct A {
    private:
       int a;
       int b;
    public:
       A () : a(0), b(0) {
       }
       A (int aa, int bb) : a (aa), b (bb) {
       }
}

要创建局部变量,请使用以下方法:

void foo () {
    A a1 ();
}

a1的范围在foo内部。要执行相同操作但不删除对象,可以使用指针:

A* bar () {
    A* a2 = new A();
    return a2;
}

a2在内存中,直到程序结束或您调用delete。但是请注意,您必须知道如何管理内存,并将指针传递回创建的对象,否则可能会导致严重的内存泄漏。

在您的情况下,栏可能看起来像这样:

singleLinkNode* bar() {
    singleLinkNode* b = new singleLinkNode();

    return b
}