C ++에서 참조로 포인터를 전달하는 이유?
어떤 상황에서 C ++에서 이러한 성격의 코드를 사용하고 싶습니까?
void foo(type *&in) {...}
void fii() {
type *choochoo;
...
foo(choochoo);
}
포인터가 가리키는 개체가 아닌 포인터를 수정해야하는 경우 참조로 포인터를 전달하는 것이 좋습니다.
이것은 이중 포인터가 사용되는 이유와 유사합니다. 포인터에 대한 참조를 사용하는 것이 포인터를 사용하는 것보다 약간 더 안전합니다.
C ++ 프로그래머의 50 %는 삭제 후 포인터를 null로 설정하는 것을 좋아합니다.
template<typename T>
void moronic_delete(T*& p)
{
delete p;
p = nullptr;
}
참조가 없으면 호출자에게 영향을주지 않고 포인터의 로컬 복사본 만 변경합니다.
David의 대답은 맞지만 여전히 약간 추상적 인 경우 두 가지 예가 있습니다.
메모리 문제를 더 일찍 발견하기 위해 해제 된 모든 포인터를 제로화 할 수 있습니다. C 스타일 :
void freeAndZero(void** ptr) { free(*ptr); *ptr = 0; } void* ptr = malloc(...); ... freeAndZero(&ptr);
C ++에서 동일한 작업을 수행하려면 다음을 수행 할 수 있습니다.
template<class T> void freeAndZero(T* &ptr) { delete ptr; ptr = 0; } int* ptr = new int; ... freeAndZero(ptr);
연결 목록을 다룰 때-종종 단순히 다음 노드에 대한 포인터로 표시됩니다.
struct Node { value_t value; Node* next; };
이 경우 빈 목록에 삽입 할 때 결과가
NULL
더 이상 포인터 가 아니므로 들어오는 포인터를 반드시 변경해야합니다 . 이것은 함수에서 외부 포인터를 수정하는 경우이므로 서명에 포인터에 대한 참조가 있습니다.void insert(Node* &list) { ... if(!list) list = new Node(...); ... }
이 질문에 예가 있습니다 .
전달 된 포인터에 메모리를 할당하고 크기를 반환하는 함수를 제공하기 위해 이와 같은 코드를 사용해야했습니다. 내 회사가 STL을 사용하여 나에게 "객체"를 제공하기 때문입니다.
int iSizeOfArray(int* &piArray) {
piArray = new int[iNumberOfElements];
...
return iNumberOfElements;
}
좋지는 않지만 포인터는 참조로 전달되어야합니다 (또는 이중 포인터 사용). 그렇지 않은 경우, 메모리 누수가 발생하는 값으로 전달되면 메모리가 포인터의 로컬 사본에 할당됩니다.
One example is when you write a parser function and pass it a source pointer to read from, if the function is supposed to push that pointer forward behind the last character which has been correctly recognized by the parser. Using a reference to a pointer makes it clear then that the function will move the original pointer to update its position.
In general, you use references to pointers if you want to pass a pointer to a function and let it move that original pointer to some other position instead of just moving a copy of it without affecting the original.
Another situation when you may need this is if you have stl collection of pointers and want to change them using stl algorithm. Example of for_each in c++98.
struct Storage {
typedef std::list<Object*> ObjectList;
ObjectList objects;
void change() {
typedef void (*ChangeFunctionType)(Object*&);
std::for_each<ObjectList::iterator, ChangeFunctionType>
(objects.begin(), objects.end(), &Storage::changeObject);
}
static void changeObject(Object*& item) {
delete item;
item = 0;
if (someCondition) item = new Object();
}
};
Otherwise, if you use changeObject(Object* item) signature you have copy of pointer, not original one.
참고URL : https://stackoverflow.com/questions/10240161/reason-to-pass-a-pointer-by-reference-in-c
'developer tip' 카테고리의 다른 글
Eclipse의 Android 장치 선택기에 Android 장치가 표시되지 않는 이유는 무엇입니까? (0) | 2020.09.13 |
---|---|
한 S3 계정에서 다른 계정으로 파일을 직접 이동 하시겠습니까? (0) | 2020.09.13 |
Python if-else 속기 (0) | 2020.09.13 |
Bootstrap 3.0 : 같은 줄에 텍스트와 입력을 사용하는 방법은 무엇입니까? (0) | 2020.09.13 |
정적 클래스 내에서 사전 선언 (0) | 2020.09.13 |