Подтвердить что ты не робот

Shared_ptr с malloc и бесплатным

Я работаю в большом приложении, которое содержит c и cpp. Все файлы сохраняются как расширение cpp, но код написан в стиле c. Я имею в виду, что это определить структуру, а не распределять память класса через malloc и realloc и calloc. В последнее время они установили библиотеку boost. Поэтому я планирую использовать в своей существующей кодовой базе. Поэтому у меня есть следующий вопрос.

  • Можно ли использовать std:: shared_ptr с malloc и бесплатно.
  • Если да, может ли кто-нибудь указать мне базовую базу кода?
  • Будет ли это влиять на любую функциональность, если я создам std:: shared_ptr в своем приложении и передаю этот указатель на другую функцию, которая использует malloc или calloc?

Или другими словами:

Как достичь аналогичной функциональности с помощью std:: shared_ptr для следующего кода:

void allocateBlocks(int **ptr, int *cnt)
{
    *ptr = (int*)malloc(sizeof(int) * 10);
    *cnt = 10;
    /*do something*/ 
}

int main()
{
    int *p = NULL;
    int count = 0;
    allocateBlocks(&p, &count);
    /*do something*/

    free(p);
}

Мы вызываем некоторые функции, которые принимают двойной указатель и заполняют структуру внутри своего приложения и используют malloc. Можем ли мы назначить этот указатель на std:: shared_ptr? Например:

typedef struct txn_s
{
    int s;
    int d;
    int *e;
} txn_t;

typedef boost::shared_ptr<txn_t> tpointer;

tpointer((txn_t*)::malloc(sizeof(txn_t),::free));
4b9b3361

Ответ 1

Можно ли использовать shared_ptr с malloc и бесплатно.

Да.

Может ли кто-нибудь указать мне базовую базу кода.

Вам нужно указать пользовательский дебетер, чтобы освободить память с помощью free, а не по умолчанию delete. Это может быть указатель на функцию free:

shared_ptr<void> memory(malloc(1024), free);

Помните, что malloc и free работают только с необработанной памятью, и вы несете ответственность за правильное создание и уничтожение любых нетривиальных объектов, которые вы захотите сохранить в этой памяти.

если я создам shared_ptr в своем приложении и передаю этот указатель на другую функцию, если они используют malloc или calloc. это повлияет на любую функциональность.

Я не совсем следую этому вопросу. Вы можете использовать этот shared_ptr взаимозаменяемо с "обычными" общими указателями, если это то, о чем вы просите. Стирание типов гарантирует, что пользователи указателей не будут затронуты разными типами дебетеров. Как и для любого общего указателя, вы должны быть немного осторожны, если вы извлечете необработанный указатель с помощью get(); в частности, не делайте ничего, что могло бы free, поскольку вы безотзывно назначили право собственности на общий указатель.

Мы вызываем некоторую функцию, которая принимает двойной указатель и заполняет структуру внутри своего приложения и использует malloc. Можем ли мы назначить этот указатель на shared_ptr.

Я думаю, вы имеете в виду что-то вроде:

double * make_stuff() {
   double * stuff = static_cast<double*>(malloc(whatever));
   put_stuff_in(stuff);
   return stuff;
}

shared_ptr<double> shared_stuff(make_stuff(), free);

UPDATE: я не заметил фразу "двойной указатель", по которой я предполагаю, что вы подразумеваете использование C-стиля указателя для эмуляции ссылки для эмулирования возвращаемого значения; вы также можете сделать это:

void make_stuff(double ** stuff);

double * stuff = 0;
make_stuff(&stuff);
shared_ptr<double> shared_stuff(stuff, free);

Как работать с realloc и calloc

Прекрасно инициализировать общий указатель с результатом calloc или что-либо еще, что возвращает память, которая будет выпущена с помощью free. Вы не можете использовать realloc, так как shared_ptr взял на себя ответственность за исходный указатель и не выпустит его без вызова free.

Ответ 2

Чтобы использовать std::shared_pointer с malloc() и free(), вы должны указать пользовательский делектор. Это должно сделать это

std::shared_ptr<T> ptr(static_cast<T*>(malloc(sizeof(T))), free);

Пока вы не проходите результат std::shared_ptr<T>::get(), ваш указатель безопасен.

Изменить: Добавлен результат от malloc() до T*.

Ответ 3

Можно ли использовать shared_ptr с malloc и бесплатно. если да, то кто-нибудь может указать мне примерную базу кода.

Да. shared_ptr не выделяет память. Тем не менее, он удаляет ваш объект, как только количество ссылок падает до нуля. Поскольку по умолчанию используется delete, и вы не можете использовать его с объектами, выделенными malloc (или любым другим способом), вы должны использовать пользовательский отладчик.

если я создам shared_ptr в своем приложении и передаю этот указатель на другую функцию, если они используют malloc или calloc. это повлияет на любую функциональность.

Непонятно, что вы спрашиваете здесь. Если эта функция не ожидает передачи общего указателя, необходимо принять дополнительную осторожность. Но это зависит от того, что на самом деле делает эта функция.

Мы вызываем некоторую функцию, которая принимает двойной указатель и заполняет структуру внутри своего приложения и использует malloc. Можем ли мы назначить этот указатель на shared_ptr.

Да, вы можете использовать любой указатель с shared_ptr.