【问题标题】:Why does this kind of initialization not work? [closed]为什么这种初始化不起作用? [关闭]
【发布时间】:2015-11-20 20:21:44
【问题描述】:

我有一个名为 Node.js 的结构。 Node 接受一个 double 并将其存储到一个名为 value 的变量中。

我正在尝试创建一个新结构。我的第一个示例有效,但第二个示例无效。第二个示例没有给出编译器错误,它构建得很好,但是当我稍后尝试从节点访问一个值时,它给了我-9.25596e+061

这段代码运行良好:

Node *firstNode; 
Node *newNode = new Node(value); 
firstNode = newNode; 

这段代码没有:

Node *firstNode; 
Node newNode(value); 
firstNode = &newNode;

我可以只使用前三行代码,但我想知道为什么其他代码不起作用。是根本错误还是语法稍有偏差?

【问题讨论】:

  • 也许这一切都在一个函数中,而newNode 在第二个示例中超出了范围?
  • 我们需要更多代码。你在哪里使用价值?在另一个函数中?
  • @Pikamander2 第一个分配在堆上并且会一直存在直到你delete它。第二个被分配为堆栈上的局部变量,一旦函数返回,它将超出范围。那时你有一个无效的指针。
  • @Pikamander2 您需要了解分配内存和使用变量地址之间的区别。如果你看到你可以同时使用这两个,那说明你没有这个理解,你真的需要学习基础知识。

标签: c++ pointers


【解决方案1】:

局部变量是automatic - 当函数返回时它们会超出范围,并且对它们的任何进一步访问(如您所做的通过指针)都是未定义的行为

newfree store 上分配内存,它独立于作用域或生命周期。它只能由delete 或在程序退出时由操作系统释放。

【讨论】:

  • 附注 - 你应该总是 delete 当你不再需要它时使用new 分配的内存。否则你会泄漏内存。
  • 哦,好吧,这是有道理的。感谢您的信息!
猜你喜欢
  • 2019-12-22
  • 2017-12-13
  • 2017-04-28
  • 2017-08-25
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多