【问题标题】:Is using ::New() allocating my smart pointer on the heap or the stack?正在使用 ::New() 在堆或堆栈上分配我的智能指针吗?
【发布时间】:2019-01-04 22:05:01
【问题描述】:

我创建一个 vtkSmartPointer 作为类变量并使用以下方法对其进行初始化:

imageStack = vtkSmartPointer<vtkImageData>::New();

imageStack(一个类变量)会被分配在堆上还是栈上?我读过这个 post 关于使用 variable = new Object();在堆上,但使用 ::New() 有什么不同吗?

另外,如果 imageStack 已经指向包含数据的内存,我通过以下方式重写它:

imageStack = vtkSmartPointer<vtkImageData>::New();

它是否释放了它之前指向的旧内存?这个post 让我相信它是,但我似乎仍然遇到堆栈溢出。

【问题讨论】:

  • 如果智能指针是在堆上分配的,那么就需要另一个智能指针来管理指向第一个智能指针的指针...根据上下文imageStack可以在堆栈上分配(如果这是在函数体内)或堆上(如果这是一个类字段初始化)。
  • 变量 imageStack 是自动的(根据您发布的完全不完整的示例进行最佳猜测)。它关于the assignment operator 的行为也被记录在案,检查起来永远不会有坏处。如果您需要有关堆栈溢出的帮助,请提交 minimal reproducible example 提交(压力最小),我们也许可以提供帮助。

标签: c++ pointers vtk


【解决方案1】:

imageStack(类变量)是分配在堆上还是栈上?

如果是静态成员变量,那么它有静态存储。如果是非静态成员变量,那么它就是类实例的子对象。当超级对象被销毁时,它就会被销毁。

但是,根据VTK的引用,变量指向的对象,由函数New创建,使用动态存储。无法在堆栈上创建vtkObject 实例(如vtkImageData)。

[任务] 是否正在释放它之前指向的旧内存?

可能;不一定。

如果智能指针曾经指向一个对象,它在被赋予新值后将不再引用该对象。 VTK 引用对细节很清楚,但它确实说智能指针使用引用计数。大概当最后一个引用被移除时,对象就被销毁了。

【讨论】:

  • 大概当最后一个引用被移除时,对象就被销毁了。是的,它就是这样工作的。
猜你喜欢
  • 2017-05-06
  • 2023-01-01
  • 2020-09-02
  • 1970-01-01
  • 2010-09-17
  • 2013-08-19
  • 2020-07-25
  • 2020-12-19
  • 2021-05-31
相关资源
最近更新 更多