Kenton,

A quick follow-up on the question above. What's the life of the heapArray? 
In other word when does the heapArray get destructed? In my application, I 
have to store the heapArray in a global vector to use later for 
serialization (possibly on a different thread), which will eventually be 
stored in a DB as a byte array/blob. A very high level implementation would 
look something like this:


        kj::Array<capnp::word> flatArray = capnp::messageToFlatArray(*
message);
        encodedSessionData[i] = flatArray.asBytes();






On Wednesday, September 30, 2015 at 5:12:44 PM UTC-4, Zach La Celle wrote:
>
> Thank you for the reply.  I ended up figuring out the ToFlatArray 
> interface, but the tip about using heapArray vs trying to do my own Array 
> is helpful.
>
> On Wednesday, September 30, 2015 at 4:59:01 PM UTC-4, Kenton Varda wrote:
>>
>> Hi Zach,
>>
>> kj::Array represents an array allocated on the heap. The size is 
>> specified at allocation time and cannot change after that. It looks like 
>> you're expecting it to behave like a growable vector.
>>
>> The constructor for kj::Array that you seem to be using is meant only for 
>> advanced users who want to play memory tricks. The normal way to allocate 
>> an array is to use kj::heapArray<byte>(size).
>>
>> But probably you should try a completely different approach:
>>
>>     kj::Array<capnp::word> words = 
>> capnp::messageToFlatArray(messageBuilder);
>>     kj::ArrayPtr<kj::byte> bytes = words.asBytes();
>>
>> -Kenton
>>
>> On Wed, Sep 30, 2015 at 11:20 AM, <[email protected]> wrote:
>>
>>> I'm trying to learn CapnProto 0.5.3, and I'm having issues writing 
>>> messages to memory instead of to file descriptors (which works fine).
>>>
>>> 1) Should I use Array or ArrayBuilder?
>>> 2) How do I initialize an Array properly?
>>> 3) Why use Array vs FixedArray?
>>>
>>> My code which I've tried to do is as follows:
>>> int serializedSizeWords = 
>>> ::capnp::computeSerializedSizeInWords(messageBuilder);
>>>
>>> ::capnp::byte byte1 = 0x00;
>>> kj::Array<::capnp::byte> array(&byte1, serializedSizeWords, 
>>> ::kj::DestructorOnlyArrayDisposer::instance);
>>> kj::ArrayPtr<::capnp::byte> arrayPtr = array.asPtr();
>>>
>>> kj::ArrayOutputStream outputStream(arrayPtr);
>>>
>>> ::capnp::writeMessage(outputStream, messageBuilder);
>>>
>>> Resulting error:
>>>
>>> terminate called after throwing an instance of 'kj::ExceptionImpl'
>>>   what():  src/kj/io.c++:229: failed: expected size <= 
>>> (size_t)(array.end() - fillPos); ArrayOutputStream's backing array was not 
>>> large enough for the data written.
>>>
>>> Any help would be appreciated!
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "Cap'n Proto" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to [email protected].
>>> Visit this group at http://groups.google.com/group/capnproto.
>>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
Visit this group at https://groups.google.com/group/capnproto.

Reply via email to