shared_ptr с malloc и бесплатно

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

  1. Могу ли я использовать std :: shared_ptr с malloc и бесплатно.
  2. Если да, может кто-нибудь указать мне пример кода базы?
  3. Повлияет ли это на какую-либо функциональность, если я создам 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));

22

Решение

Могу ли я использовать 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);

ОБНОВЛЕНИЕ: я не нашел фразу «двойной указатель», под которой я предполагаю, что вы имеете в виду использование указателя в стиле 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,

27

Другие решения

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

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

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

Редактировать: Добавлено приведение результата malloc() в T*,

4

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

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

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

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

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

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

1
По вопросам рекламы [email protected]