2013-10-07 1 views
1

Я пишу библиотеку, которая будет использоваться многими приложениями. Есть ли предпочтительный способ выделения буфера? Должен ли пользователь malloc в основном приложении? Или библиотечная функция malloc? Обратите внимание, что производительность или использование пространства не вызывает беспокойства. Я спрашиваю больше о хорошей проектной перспективе для разработки API.Где находится пользовательский буфер malloc? Код пользователя или код библиотеки?

[1] Применение выделяет буферное пространство:

int main() 
{ 
    char **abc = malloc (1024*sizeof(char*)); 
    abc[0] = malloc .. 
    abc[1] = malloc .. 

    foo(abc); 
    free_all(abc); 
} 

/*================================*/ 

//external API 
void foo(char **abc) { 
    strncpy(abc[0], "hello\0", 6); 
    strncpy(abc[1], "world\0", 6); 
    //and so on 
} 

[2] библиотеки функций mallocs буфера

int main() 
{ 
    char **abc = NULL; 
    foo(&abc); 
    free_all(abc); 
} 

/*================================*/ 

//external API 
void foo(char ***abc) 
{ 
    int num_elem = 32; 
    *abc = malloc (num_elem * sizeof(char*)); 
    (*abc)[0] = malloc(6); 
    (*abc)[1] = malloc(6); //and so on 
    strncpy((*abc)[0], "hello\0", 6); 
    strncpy((*abc)[1], "world\0", 6); 
    //and so on 
} 

ответ

1

Рассмотрим:

  1. ли пользователь сможет определить, сколько памяти требуется?
  2. Может ли память потребоваться для одного элемента в течение его срока службы?

Если пользователь может знать, сколько места выделить и данные не меняет требования к пространству, то это приемлемо для любого пользователя или библиотеку, чтобы управление памятью

Если одна из этих точек не является true, было бы лучше, если бы библиотека могла управлять пространством. Для этого требуется дополнительная связь между пользователем и библиотекой для управления памятью. В первом случае, чтобы узнать, сколько места требуется, а во втором - указать, что библиотека не может выполнить запрошенную операцию, пока пользователь не выделит больше места.

+0

Пожалуйста, [примите ответ] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235), если это было полезно. – Spaceghost

0

Пусть пользователю выбрать: внутренний Lib или аллокатор определенного пользователя аллокатор.

+0

Мне нужно разработать API и сообщить пользователю, должен ли он передать указатель NULL или выделенный буфер, поэтому я должен принять это решение. – jitihsk

+0

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

Смежные вопросы