使用:: New()在堆或堆栈上分配智能指针吗?

时间:2019-01-04 22:05:01

标签: c++ pointers vtk

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

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

将在堆或堆栈上分配imageStack(一个类变量)吗?我已经阅读过post,有关使用变量= new Object();。在堆上,但是使用:: New()有什么不同吗?

此外,如果imageStack已经指向内存中包含数据的内存,那么我会这样做:

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

是否释放了以前指向的旧内存? post使我相信它是,但是我似乎仍然会出现堆栈溢出。

1 个答案:

答案 0 :(得分:2)

  

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

如果它是静态成员变量,则它具有静态存储。如果它是一个非静态成员变量,则它是类实例的子对象。当超级对象被销毁时,它将被销毁。

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

  

[作业]是否释放了以前指向的旧内存?

可能;不一定。

如果智能指针曾经指向一个对象,则在为其分配了新值后,它将不再引用该对象。 VTK参考没有详细说明,但确实指出智能指针使用参考计数。大概在删除最后一个引用时,该对象将被破坏。