2012-07-22 64 views
3

在我的Apache模塊中,它是用C++構建的,當我嘗試向我的模塊提供功能時,我使用了字符串,向量和相關內容。我可以在Apache模塊中安全地使用Boost和/或C++庫嗎?

我擔心的是我不使用Apache的內存池,並且該程序將沿途段錯誤,但在同一時間,我有一定的任務難度像這樣:

static void parseSTR(char *input, const char *sep, int &count, apr_table_t *&values, apr_pool_t *mp) 
{ 
    char *part, *next; 

    if (isStrNull(input)) 
     return; 

    count = 1; 

    part = apr_strtok(input, sep, &next); 

    while (part) { 
     apr_table_set(values, apr_itoa(mp, count), part); 

     part = apr_strtok(NULL, sep, &next); 

     count++; 
    } 
} 

我正在使用分隔字符串分析器來解析URL和域名。當然,有一種更有效的方式來提供這種功能。我現在用的是apr_table結構包含各個部分,我知道我可以使用一個apr_array_header,但是....

所以我想知道:

  1. 我可以用加速來提供缺失的功能SAFELY?
  2. 我是否會遇到內存衝突,因爲我沒有使用內存池?
  3. 對於釋放自己記憶的字符串,矢量等,這是一個等待的問題嗎?

我確實在搜索這個問題,但其他問題似乎並不相同。

回答

2

使用Boost應該是安全的,它取決於您正在使用的具體的零件,以便對其安全性進行任何明確的調用。至於內存管理,你可以自己編寫使用Apache/APR內存分配的std :: allocator實現。然後,您可以將此分配器作爲模板參數傳遞給您正在使用的STL容器(通常爲第二個模板參數)。

至於Boost的智能指針(如果你正在使用它們),他們可以(在構造上)給一個函數指針作爲參數來實現內存釋放(作爲delete的替代)。

E.g.像這樣的分配器能爲你做的伎倆:

#include <stdexcept> 

template <typename T> 
class apr_allocator 
{ 
    public: 
     typedef size_t size_type; 
     typedef ptrdiff_t difference_type; 
     typedef T*  pointer; 
     typedef const T* const_pointer; 
     typedef T&  reference; 
     typedef const T& const_reference; 
     typedef T   value_type; 

     template<typename U> 
     struct rebind 
     { typedef apr_allocator<U> other; }; 

     pointer allocate(size_type n, const void* = 0) 
     { 
      pointer new_mem = apr_do_whatever_is_necessary_to_allocate(n * sizeof(value_type)); 
      if (!new_mem) 
       throw std::bad_alloc(); 
      return new_mem; 
     } 

     void deallocate(pointer p, size_type n) 
     { 
      apr_release_memory(p, n); 
     } 

     pointer address(reference r) const 
     { 
      return &r; 
     } 

     const_pointer address(const_reference r) const 
     { 
      return &r; 
     } 

     size_type max_size() const 
     { 
      // Largest amount of elements T that can meaningfully be allocated 
      return 1337; 
     } 

     void construct(pointer p, const_reference val) 
     { 
      new ((void *)p) value_type(val); 
     } 

     void destroy(pointer p) 
     { 
      p->~T(); 
     } 
}; 

template <typename T> 
inline bool operator==(const apr_allocator<T>& a, const new_allocator<T>& b) 
{ 
    if (&a == &b) 
     return true; 
    if (/* a can deallocate elements created with b and vice-versa */) 
     return true; 
    return false; 
} 

template <typename T> 
inline bool operator!=(const apr_allocator<T>& a, const apr_allocator<T>& b) 
{ 
    return !(a == b); 
} 

還要注意的是,如果你的分配需要內部狀態(如參照特定的存儲池),你必須確保分配器是複製施工的。它也是必須是默認可構造的(儘管您可以將預構造的實例作爲參數傳遞給STL容器的構造函數)。

+0

謝謝這有助於很多! – 2012-07-24 15:25:50

0

我們在Windows上的Apache中大量使用C++和Boost,並且我們沒有看到與我們使用new或類似的C++ isms相關的任何問題。

相關問題