2017-12-14 13 views
0

다음 코드는통과 C++ 간의 데이터 및

vector<char> buf; 
// code that populates the vector 

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size()); 

//return buffer to node  
args.GetReturnValue().Set(scope.Escape(nbuf)); 

노드 업그레이드를 v6.11을 v0.12에서 노드를 업그레이드 한 후 발행의 원인이되는 nodejs는 변경하지 암시 :

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size()).ToLocalChecked()); 

문제는 노드의 버퍼 내용을 인쇄 할 때 내용이 동일하지 않다는 것입니다. 질문 : 노드 v6.11을 사용할 때 노드 v0.12에서 사용했던 것과 동일한 동작을 어떻게 얻을 수 있습니까?

업데이트 : 몇 가지 연구 후 근본적인 문제를 발견했습니다. 버퍼 : 새로운 호출 ArrayBuffer :: New는 기존 메모리 버퍼의 맨 위에 arrayBuffer를 작성하므로 범위를 벗어나면 버퍼에있는 내용 만 포함됩니다. 스택. In node-v0.12 Buffer : New는 자신이 소유 한 데이터의 복사본을 만드는 것입니다. 문제는 여전히 노드 -v6을 사용하여 동일한 동작을 수행하는 방법을 모르겠다.

+0

은 무엇'ToLocalChecked()가'할 의도는 무엇입니까? – CinCout

+1

@CinCout 노드 API의 일부입니다. MaybeLocal을 로컬로 변환한다 로컬로 Pandrei

+0

단지 호기심에, 왜 'buf'대신에 '& buf [0]'을 사용합니까? –

답변

0

경우를 누구나이를 게시 지금 같은 문제를 통해 제공 :

문제는 그 새로운 :: 버퍼 (의 구현 V6 노드 0.12와 노드 사이 .. .)

MaybeLocal<Object> New(Isolate* isolate, const char* data, size_t length) 

이 변경되었습니다 노드 0.12에서 노드 버전 6 ArrayBuffer::New(env->isolate(), data, length)를 호출하고이 데이터를 복사하지 않습니다 단지 동안 방어 적이기를 호출하는 데 사용. 문서에 따르면

정적 지역 V8 :: ArrayBuffer :: 새로운 기존의 메모리 블록을 통해 새로운 ArrayBuffer 만들기

(*의 분리, 무효 * 데이터를 size_t byte_length를 분리). 생성 된 배열 버퍼는 즉시 외부화 된 상태 인 에 있습니다. 생성 된 ArrayBuffer가 가비지 수집 될 때 메모리 블록은 회수되지 않습니다.

그래서 ArrayBuffer가 빌드 된 로컬로 생성 된 벡터가 범위를 벗어나면 스택에있는 것이 무엇이든지 남아있게됩니다.

해결 방법 : 전화 Buffer::Copy(args.GetIsolate(), &buf[0], buf.size());

0

ToLocalChecked()이 잘못된 개체에 있습니다. 수정은 다음과 같습니다

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size()).ToLocalChecked();

+1

은 미안하다. 실제로 올바른 객체에있다. – Pandrei