我试图在C ++中创建一个自定义数据结构,类似于双链表。因此,在类构造函数中,我正在创建一个结构实例(请参见下面的代码),但是在更改范围时无法“保存”它。
我尝试用关键字new创建实例,但是当我使用调试器运行程序时,我看到在上一个作用域中创建的对象已被“优化”。
在先前的作用域中,我的意思是当我处于if循环的作用域中,然后输入另一个if语句时,似乎我在第一个语句中创建的实例消失了。
我不确定“优化”到底是什么意思。我正在使用CLion,这就是我更改范围时在调试器中显示的消息。
该结构的代码为:
struct singleLinkNode {
int column;
int data;
singleLinkNode *nextSingleNode;
};
我的目标是创建一个保留在内存中的结构实例,直到我删除它或程序结束为止。
提前谢谢!
答案 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
}