Как создать shared_ptr для передачи в функцию, которая принимает void * - PullRequest
2 голосов
/ 23 марта 2010

Вот и все. Мне нужно выделить память и передать ее функции, которая занимает пустое место *. Я хотел бы использовать shared_ptr, но я не знаю, как это сделать.

Ответы [ 2 ]

5 голосов
/ 23 марта 2010

Вы имеете в виду что-то вроде:

boost::shared_ptr<int> myInt(new int(5));

call_some_function(myInt.get());

Это только позволяет функции использовать int*. Он не должен пытаться удалить его или стать владельцем.


Если вам нужна только необработанная память, используйте vector:

std::vector<char> memory(blockSize);

call_some_function(&blockSize[0]);

Опять же, память принадлежит vector.


Если ваша функция хочет владеть ею, вам не нужно оборачивать ее во что-то, поскольку вы не будете управлять ею:

call_some_function(new int);
call_some_function(new char[blockSize]);

Убедитесь, что функция освободит его, позвонив по номеру delete / delete[]. Если нет (например, он намеревается использовать free()), вам нужно будет использовать malloc вместо этого:

template <typename T>
T* malloc_new(void)
{
    void* memory = std::malloc(sizeof(T));
    if (!memory)
        throw std::bad_alloc();

    try
    {
        return new (memory) T();
    }
    catch(...)
    {
        std::free(memory);
        throw;
    }
}

call_some_function(malloc_new<int>());
call_some_function(malloc(blockSize));
0 голосов
/ 23 марта 2010

Вы также можете использовать std :: string в качестве контейнера с BLOB-памятью. Это так же эффективно, как shared_ptr для char * vector (возможно, лучше)

...