使用 ::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 参考没有详细说明,但它确实说智能指针使用引用计数。据推测,当最后一个引用被删除时,对象被销毁。
我将 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 参考没有详细说明,但它确实说智能指针使用引用计数。据推测,当最后一个引用被删除时,对象被销毁。