2016-11-28 4 views
2

Мне нужен класс (в C++ 11), который хранит пару полей (включая буфер). Я начал с malloc() в конструкторе и free() в деструкторе (я не касался C/C++ в течение некоторого времени, так что это все, что я вспомнил).C++ Буферные боли

Следующее, что я вспомнил (из-за сбоев), что мне нужно реализовать конструктор копирования и оператор присваивания. Теперь у меня есть полный экран кода только для класса с 3 полями (одним из которых является буфер).

вопрос.

Что следует использовать? (Я ослеплен количеством выборов - std::vector, std::array, std::shared_ptr, boost::scoped_ptr и может быть чем-то еще).

Функциональность для этого буфера, который я искал являются:

  • как можно меньше управления памятью
  • избавлении от этих конструкторов копирования и операторов присваивания
  • возможность использовать его недействительным * (Я должен передать его функциям, которые принимают «void *»)
  • Возможность доступа к чтению/записи в случайном порядке (возможно, мне понадобится получить случайный диапазон и записать произвольный диапазон)
  • выделить его в куче (буфер может быть достаточно большим)
  • предпочтительно использование некоторого стандартного объекта
+0

Нужно уметь копировать или назначать свой класс? –

+4

Использование 'malloc' и' free' в коде C++ почти всегда является ошибкой. Кроме того, вы не можете «избавиться от этих конструкторов копирования и операторов присваивания». Они являются одним из многих фундаментальных аспектов C++. Если вы не хотите их использовать, не используйте C++. –

+0

@KerrekSB Да. Я хочу, чтобы иметь возможность копировать мой класс. Однако я надеюсь, что какой-нибудь умный указатель справится с этим. Я бы предпочел, чтобы они делили указатель и подсчитывали ссылки. Однако даже прямое копирование контента работает для меня. –

ответ

4

В качестве буфера следует использовать только std::vector<unsigned char>. У этого уже есть все необходимые конструкторы, операторы и деструктор, поэтому вам ничего особенного не нужно делать, кроме как использовать его.

0

Я не эксперт C++, поэтому я приветствую любые критические замечания к этому решению, но умный указатель на массив может работать.

#include <iostream> 
#include <memory> 


void do_something(void *buffer) 
{ 
    char* char_buffer = (char*)buffer; 
    std::cout << char_buffer[0] << std::endl; 
} 


int main() 
{ 
    size_t size = 10; 

    // reference counted pointer to auto-delete the buffer 
    std::shared_ptr<char> buffer(new char[size], std::default_delete<char[]>()); 

    // use the underlying pointer 
    // http://stackoverflow.com/questions/27819809/why-is-there-no-operator-for-stdshared-ptr 
    buffer.get()[0] = 'a'; 

    do_something(buffer.get()); 
    // buffer deallocated at the end of scope 
} 
  • как мало, как управление возможна памятью

Умный указатель заботится о том, что для вас

  • избавления от этих конструкторов копирования и операторов присваивания

Я думаю, что умный указатель обрабатывает их

  • возможность использовать его в качестве ничтожной * (я должен передать его функции, которые принимают «недействительным *»)

Используйте .get() и бросок.

  • Возможность доступа для чтения/записи его в случайном порядке (я, возможно, потребуется, чтобы получить случайный выбор из него и написать произвольный диапазон к нему)

Это еще указатель в конце этого, поэтому я не понимаю, почему это не сработает (я не пробовал).

  • передать его в куче (буфер может быть достаточно большой)

Это на куче

  • предпочтительно использование некоторого стандартного объекта

<memory>

Alternativel y, checkout <vector>.data() Функция, которая возвращает указатель на базовый массив вектора.

0

Я думаю, вам нужен какой-то буфер памяти. Проверьте этот простой класс буфера C++. Не использовать C++ 11 намеренно из-за моей среды разработки моей компании.
https://github.com/jeremyko/CumBuffer

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