2012-01-12 2 views
3

C++에서 원시 포인터를 사용하는 것이 좋지 않습니다. 대신 auto_ptr을 사용해야합니다. 아래 코드에서 에 생성 된 foo()의 벡터를 채 웁니다. 내가 올바르게하고있는 중이거나 명시 적 포인터를 사용하지 않고 할 수있는 더 좋은 방법이 있습니까?C++에서 명시 적/원시 포인터 사용

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

void foo(vector<string>& v){ 
    v.push_back(" hru"); 
} 

int main(){ 
    vector<string> v; 
    v.push_back("hi"); 
    foo(v); 
    for(int i=0;i<v.size(); i++){ 
     cout << v[i]; 
    } 
} 

참조 및 포인터가 비슷 하나 개의 매우 중요한 차이로 :

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

void foo(vector<string> *v){ 

    (*v).push_back(" hru"); 
} 

int main(){ 
    vector<string> v; 
    v.push_back("hi"); 
    foo(&v); 
    for(int i=0;i<v.size(); i++){ 
     cout << v[i]; 
    } 

} 
+1

보통 auto_ptr은 원하는 내용이 아닙니다. –

+0

원시 포인터가 나쁜 사람은 누구입니까? 포인터 메모리 할당과 할당 해제의 메커니즘과 수행해야 할 작업을 이해할 때까지 나쁘지 않습니다. 이것은 C++ (http://www.boost.org/doc/libs/1_48_0/libs/smart_ptr/smart_ptr.htm)에서 사용되는 좀 더 똑똑한 포인터입니다. STL 컨테이너와 auto_ptr을 절대로 혼합하지 마십시오. – DumbCoder

+0

@DumbCoder 나는 당신이 "이해할 때까지는 _only_ 나쁜 것"이라고 생각한다. –

답변

4

C++는 당신이 뭘 하려는지에 대한 참조를 사용하는 Null 참조 같은 건 없다 (Constructing one은 C++의 에서 Undefined Behavior입니다. 하나를 만들 수 있지만 해킹은 입니다.)

+1

"당신은 하나를 만들 수 있습니다.": C++에는 null 참조가 없으며 하나는 정의되지 않은 동작입니다. –

+0

@TonyTheLion 그건 내가 말한 것보다 더 많거나 적습니다. "undefined behavior"에 대한 동의어를 사용했다는 것을 제외하고 말입니다. :) – dasblinkenlight

+0

오, 알았어요. 그래서 나는 "해킹"이 UB를 말하는 또 다른 방법이라고 생각합니다. TIL –

3
포인터를 피하고 패스 참조에 의한 사용할 수 있습니다 ++ C에서

:

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

void foo(vector<string>& v){ 

    v.push_back(" hru"); 
} 

int main(){ 
    vector<string> v; 
    v.push_back("hi"); 
    foo(v); 
    for(int i=0;i<v.size(); i++){ 
     cout << v[i]; 
    }  
} 
0

당신은 당신이 (예를 들어, 클래스 인스턴스에 의해 생성 된 힙에 생성 된 오브젝트를 처리 할 때 auto_ptr은 사용에 대해 생각하기 시작 할 수 있습니다 "새로운"). 벡터는 요소를 값, std :: string 요소로 보유합니다. 따라서 여기서는 auto_ptr을 전혀 고려할 필요가 없습니다. 벡터에 힙에 생성 된 인스턴스가 있으면 다음과 같이 사용할 수 있습니다.

std::vector< auto_ptr<MyType> > vec; 

auto_ptr<MyType> a(new MyType()); 

vec.push_back(a); 

그런 다음 벡터 요소가 예를 들어. 범위를 벗어난 인스턴스가 'a'인스턴스가 자동으로 삭제됩니다.

즉, auto_ptr은 일종의 자동 개체 삭제 기능을 수행하는 일종의 가비지 수집기입니다. auto_ptr에 대한 자세한 내용은 여기를 참조하십시오. http://www.cplusplus.com/reference/std/memory/auto_ptr

+0

std :: vector의 std :: auto_ptr은 결코 좋은 생각이 아닙니다. 이러한 유형의 기능이 필요한 경우에는 boost :: ptr_vector를 대신 사용해야합니다. – mocj

+1

@boto : 답변 해 주셔서 감사합니다. 나는 그것을하는 것이 나쁜 생각이라고 생각한다. 나는이 질문에 관련이있다 http://stackoverflow.com/questions/4577838/smart-pointers-in-container-like-stdvector – FourOfAKind

+0

오른쪽 스마트 포인터로 auto_ptr을 사용하지 않을 것이다. 단순히 스마트하지 않기 때문이다. 바늘. 하지만 제한된 범위에서 개체를 임시로 보관하고 삭제하는 것에 대해 걱정하지 않아도됩니다. – boto