2010-12-10 2 views
2
async_write(*this, BoostAsio::buffer(pck->_storage), boost::bind(&tcp_socket::handle_wrote, this, pck, BoostAsio::placeholders::error)); 

pck가 힙에 할당되면 삭제해도 _storage가 무효화되거나 async_write가 내부 구조로 버퍼를 복사하고 스택에서 자유롭게 삭제되거나 할당 될 수 있습니까?async_write - 부스트. 버퍼를 복사합니까?

감사합니다.

+0

소스 코드를 읽어 보시겠습니까?!?! – jkp

답변

2

async_write 함수는 버퍼를 복사하지 않습니다. 내부의 const_buffer 객체를 더 깊은 라이브러리 함수에 전달합니다. const_buffer 개체에는 실제 버퍼에 대한 내부 포인터가 들어 있으므로 딥 복사는 수행되지 않습니다. 비동기 처리기가 호출 될 때까지 pck->storage이 유효한지 확인해야합니다.

이것은 확실히 최선의 방법입니다. 매번 버퍼를 복사하면 성능이 크게 저하됩니다.

+0

int를 쓰면 어떨까요? 완전 복사는 연산자 new()를 저장할 수 있습니다. – jean

0

버퍼 또는 적어도 일부는 커널의 소켓 버퍼에 복사됩니다. 보통 이것은 큰 문제가 아닙니다. 그러나 작동 중에 응용 프로그램의 버퍼를 사용하려면 송신 버퍼를 0으로 설정할 수 있습니다. 물론 송신 버퍼를 사용 불가능하게하는 다른 결과를 이해하지 않고서는 안됩니다.