2017-02-17 5 views
1

람다 함수에 대한 참조로 널 포인터를 전달하려고 시도하지만 널 대신에 메모리 주소를 수신합니다.람다 함수에 전달 된 널 포인터가 더 이상 null이 아닙니다.

function<void(json)> doTheThing(){ 
    ... 
    pointer = nullptr; 
    return [&](json object) { 
    if(pointer != nullptr) { 
     cout<<"pointer not null"; 
} 
} 

포인터가 null이되도록 전달하는 방법을 알려주세요.

+3

'포인터'는 어디에 선언되어 있습니까? doTheThing()에 국부적입니까? – NathanOliver

+0

@ NathanOliver, OP가 'auto f = doTheThing(); f();'이 경우 포인터가 모두 범위를 벗어났습니다. – SingerOfTheFall

+0

@SingerOfTheFall 이미 주석을 수정했습니다. 우리는'pointer'가 선언 된 곳을 알아야합니다. – NathanOliver

답변

2

[&]은 참조에 의한 암시 적 캡처를 의미합니다.

참조로 캡처하는 경우, 존재하는 한 정의 된 상태로 유지됩니다. std::function으로 변환 된 람다를 반환하는 것으로 보입니다. 참조로 캡처하는 것은 매우 나쁜 생각입니다.

로컬 변수가 범위를 벗어납니다. 람다에서 캡쳐 된 참조는 현재 정의되지 않은 상태이며 모든 사용은 정의되지 않은 동작입니다. 그런 다음 std::function에이 람다 복사본을 보내고 그것을 호출하고 비강 악마가 코를 뽑습니다. 또는 귀하의 경우, 포인터가 null으로 나타나지 않습니다.

수명이 있거나 사본의 수명이 현재 범위를 초과하는 람다에서 참조로 암시 적으로 캡처하지 마십시오.

일반적으로 [=]을 사용해도 상황을 암시 적으로 포착하지 마십시오. 노골적으로 말하십시오.

std::function<void(json)> doTheThing() { 
    void* pointer = nullptr; 
    return [pointer](json object) { 
    if(pointer != nullptr) { 
     std::cout<<"pointer not null"; 
    } 
    }; 
} 
+0

위의 답변을 upvote하지 마십시오; 이것은 복제본입니다. 이 답변은 OP의 특별한 경우에 대한 OP에 설명하기 위해 존재합니다. 대신 거기에 중복 및 upvote 따라 :) – Yakk