Использует ли :: New () мой интеллектуальный указатель на кучу или стек? - PullRequest
0 голосов
/ 05 января 2019

Я создаю vtkSmartPointer как переменную класса и инициализирую его, используя:

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

будет ли imageStack (переменная класса) размещаться в куче или стеке? Я прочитал этот пост об использовании variable = new Object (); быть в куче, но использует ли :: New () что-то другое?

Кроме того, если imageStack уже указывает на память с данными в ней, и я перезаписываю ее, выполняя:

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

освобождает ли старую память, на которую указывал ранее? Эта запись заставляет меня поверить, что это так, но я все еще, кажется, получаю переполнение стека.

1 Ответ

0 голосов
/ 05 января 2019

будет ли imageStack (переменная класса) размещаться в куче или стеке?

Если это статическая переменная-член, то она имеет статическое хранилище. Если это нестатическая переменная-член, то это дочерний объект экземпляра класса. Он будет уничтожен при уничтожении суперобъекта.

Однако, согласно ссылке на VTK, объект, указанный переменной и созданный функцией New, использует динамическое хранилище. Невозможно создать vtkObject экземпляров (например, vtkImageData) в стеке.

[назначение] освобождает старую память, на которую оно указывало ранее?

Возможно; не обязательно.

Если умный указатель используется для указания на объект, он больше не будет ссылаться на этот объект после того, как ему было присвоено новое значение. Ссылка на VTK очень легка в деталях, но она говорит, что интеллектуальный указатель использует подсчет ссылок. Предположительно, когда удаляется последняя ссылка, объект уничтожается.

...