使用 ::New() 是在堆上还是在堆栈上分配我的智能指针?

Is using ::New() allocating my smart pointer on the heap or the stack?

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

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

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

此外,如果 imageStack 已经指向其中包含数据的内存,并且我通过以下方式覆盖它:

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

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

would imageStack (a class variable) be allocated on the heap or the stack?

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

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

is [the assignment] freeing the old memory it was pointing to prior?

可能;不一定。

如果智能指针曾经指向一个对象,它在被赋值后将不再引用该对象。 VTK 参考没有详细说明,但它确实说智能指针使用引用计数。据推测,当最后一个引用被删除时,对象被销毁。