【问题标题】:How can I create an instance of a struct, that will not be deleted when it is out of scope?如何创建结构的实例,当它超出范围时不会被删除?
【发布时间】:2019-05-05 13:09:13
【问题描述】:

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

我尝试使用关键字 new 创建实例,但是当我使用调试器运行程序时,我发现我在前一个范围内创建的对象已“优化”。

之前的范围是指当我处于 if 循环的范围内时,然后我输入另一个 if 语句,看起来我在第一个中创建的实例已经消失了。

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

结构体的代码是:

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

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

提前谢谢你!

【问题讨论】:

  • new 是正确的方法。 “以前的范围”和“优化”是什么意思?显示一个 minimal reproducible example 来演示这种假定的行为。
  • 你真的要单身吗?
  • "所以在类构造函数中,我正在创建一个结构实例(参见下面的代码),但在更改范围时无法“保存”它。 “那为什么不让它成为班级成员呢?无论如何,除非我们能看到您想用它做什么,否则我们无法真正回答您的问题。
  • 等一下...您是在循环中创建具有同名的实例吗?复合语句出现块范围(任何用大括号括起来的东西,包括循环和条件的多行主体),但它们应该只在存在名称冲突时才隐藏。在循环之外声明一个数组并将循环实例创建为数组元素是否有效? (编辑:对,对。c++.ahem,“循环外的向量......”)

标签: c++ memory-management


【解决方案1】:

“优化”是指

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

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

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

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

【讨论】:

  • "optimized out" 在调试器中通常只是意味着调试器没有足够的信息来找到对象的位置。即使对象是活动的并且可以从程序代码中访问,在优化的构建中也经常发生;并不是说一定是这样,但是在调试优化的二进制文件时非常清楚这一点很重要。
猜你喜欢
  • 2016-02-10
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多