2017-05-03 1 views
-4

B 행을 실행하면 모든 것이 정상적으로 보이지만 A 행으로 바꿀 때 충돌이 발생하고 이유를 모르겠습니다.C++ :이 스마트 동적 포인터를 사용할 수없는 이유는 무엇입니까?

#include <iostream> 
#include <vector> 
#include <memory> 

using namespace std; 

int main() { 
    vector<int> vi(10,5); 
    auto ptr = make_shared<vector<int>>(vi); //A 
    // auto ptr = &vi; //B 
    auto beg = ptr->begin(); 
    while (beg != vi.end()) 
    cout << *beg++ << " "; 
    return 0; 
} 
+1

코드와 문제의 설명을 함께 작성하십시오. 무언가에 대한 링크가 없습니다. – granmirupa

+0

설명에 프로그램의 목록을 포함 시키십시오, 아무도 코드의 이미지를보고 싶지 않습니다 .. – Gnqz

+0

이미지를보고 싶지 않다 이외에; 다른 사람이 같은 문제를 찾아 오면 찾아 낼 수 없습니다. 또는 그들이 어떻게 든 질문에서이 페이지를 찾을 수 있다면 코드를 더 이상 사용할 수 없습니다. – UKMonkey

답변

1

당신은 ptr->begin()vi.end()을 사용하고 있습니다. * ptr이 vi 일 때 괜찮습니다. 그러나 make_shared<vector<int>>(vi) 행은 실제로 복사 생성자를 호출하고 vi의 새 복사본을 만듭니다.

auto ptr = shared_ptr<vector<int>>(&vi, [](vector<int>*){}); //A 

이는 shared_ptr을에게 빈 Deleter가 있습니다, 그래서 스택에서 아무것도 삭제하려고하지 않습니다 당신이 정말로 스택에있는 shared_ptr을 작성해야하는 경우

이처럼 만들 필요가 (충돌을 일으킬 수 있음).

참고 : 이것은 shared_ptr의 전체 목적을 위반하기 때문에 거의 항상 나쁜 생각입니다. 더 이상 아무것도 소유하지 않습니다. 이것은 디버깅하기가 혼란 스럽습니다. 스택 벡터 이 확실히이 shared_ptr을 사용하는 것보다 오래 지속되는지 확인해야합니다. 그렇지 않으면 앱이 중단됩니다.

+0

알겠습니다, thanks buddy – Murphy

관련 문제