vtkSmartPointers는 전달 (복사)하기위한 것이며, 배열을 만들거나 컨테이너 (예 : std :: vector)를 만들 수 있습니다.
typedef vtkSmartPointer<vtkMRMLLinearTransformNode> NodePtr;
NodePtr CreateNode() {
NodePtr node = NodePtr::New();
node->ApplyTransform(xfm);
return node;
}
std::vector<NodePtr> nodes;
for (int i = 0; i < nNodes; ++i) {
nodes.push_back(CreateNode());
}
같은 직관적 인 방법으로 당신은 함수에서 smartpointers의 벡터를 반환 할 수 있습니다 또는 다른 함수에 인수로 전달합니다.
유일하게 위험한 것은 함수에서 반환 할 때 vtkSmartPointer 밑에서 원시 포인터를 노출하는 것입니다. 항상 위의 CreateNode() 예제와 같은 스마트 포인터를 반환하십시오.
vtkMRMLLinearTransformNode* BadFooWillCrash() {
NodePtr node = NodePtr::New();
// do something with node
// the smart pointer will go out of scope and the object will be deleted!
return node;
}
원시 포인터를 인수로 사용하는 것은 꽤 괜찮습니다.
void WorkNode(vtkMRMLLinearTransformNode* node) {
// do something with node
}
NodePtr newNode = NodePtr::New();
WorkNode(newNode);
그냥뿐만 아니라 당신이 인수로 smartpointer을 통과 할 수
void WorkNode2(NodePtr node) {
// do something with node
}
VTK의 참조 카운터에서 객체 자체 내에서 유지하기 때문이다, 그래서 pointee 개체 포인터를 가리 얼마나 많은 알고 그것 (당신은 GetReferenceCount() 메소드를 시도 할 수있다). 단점은 vtkSmartPointer에 의해 관리되는 객체가 vtkObject에서 파생되어야한다는 것입니다.
일부 추가 정보를 원하시면 당신은 http://www.vtk.org/Wiki/VTK/Tutorials/SmartPointers
이 도움을 주셔서 감사합니다 여기에서 찾을 수 있습니다. 이것은 명확하게 나의 이해의 틈새를 메웠다. – bdan629
다행이었습니다 :) – mirni