У меня есть работа в большом приложении, которое содержит c и cpp. Все файлы сохраняются с расширением cpp, но код написан в c-стиле. Я имею в виду, что она определяет структуру, а не класс выделяет память через malloc, realloc и calloc.В последнее время они установили библиотеку boost. Поэтому я планирую использовать ее в своей существующей базе кода. У меня есть следующий вопрос.
Или другими словами:
Как мне добиться аналогичной функциональности с помощью 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));
Могу ли я использовать 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
,
Использовать std::shared_pointer
с malloc()
а также free()
Вы должны указать пользовательский удалитель. Это должно сделать это
std::shared_ptr<T> ptr(static_cast<T*>(malloc(sizeof(T))), free);
Пока вы не передадите результат std::shared_ptr<T>::get()
Ваш указатель в безопасности.
Редактировать: Добавлено приведение результата malloc()
в T*
,
Могу ли я использовать shared_ptr с malloc и бесплатно.
если да Может ли кто-нибудь указать мне пример кода базы.
Да. shared_ptr
не выделяет саму память Тем не менее, он удаляет ваш объект, когда счетчик ссылок падает до нуля. Так как он использует delete
по умолчанию, и вы не можете использовать его с объектами, выделенными malloc
(или любым другим способом), вы должны использовать пользовательский удалитель.
если я создаю shared_ptr в своем приложении и передаю этот указатель другой функции, если они используют malloc или calloc. повлияет ли это на любую функциональность.
Не понятно, о чем ты здесь спрашиваешь. Если эта функция не ожидает, что совместно используемый указатель будет передан, то нужно быть особенно внимательным. Но это зависит от того, что на самом деле делает эта функция.
У нас есть вызов некоторой функции, которая принимает двойной указатель и заполняет структуру внутри их приложения и использует malloc. Можем ли мы назначить эти указатели для shared_ptr.
Да, вы можете использовать любой указатель с shared_ptr
,