## Buffers, language, script and direction

The input to HarfBuzz is a series of Unicode characters, stored in a buffer. In this chapter, we'll look at how to set up a buffer with the text that we want and then customize the properties of the buffer.

## Creating and destroying buffers

As we saw in our Getting Started example, a buffer is created and initialized with `hb_buffer_create()`. This produces a new, empty buffer object, instantiated with some default values and ready to accept your Unicode strings.

HarfBuzz manages the memory of objects (such as buffers) that it creates, so you don't have to. When you have finished working on a buffer, you can call `hb_buffer_destroy()`:

      hb_buffer_t *buffer = hb_buffer_create();
      ...
      hb_buffer_destroy(buffer);

This will destroy the object and free its associated memory - unless some other part of the program holds a reference to this buffer. If you acquire a HarfBuzz buffer from another subsystem and want to ensure that it is not garbage collected by someone else destroying it, you should increase its reference count:

    void somefunc(hb_buffer_t *buffer) {
      buffer = hb_buffer_reference(buffer);
      ...

And then decrease it once you're done with it:

      hb_buffer_destroy(buffer);
    }

To throw away all the data in your buffer and start from scratch, call `hb_buffer_reset(buffer)`. If you want to throw away the string in the buffer but keep the options, you can instead call `hb_buffer_clear_contents(buffer)`.