Я создаю буфер для сетевых подключений, где вы можете явно выделить память или вы можете предоставить ее самостоятельно через какой-то последовательный контейнер (например ::std::vector,std::array), в котором эти чанки памяти хранятся всписок того, что мы используем позже для операций чтения / записи.(куски необходимы для обработки нескольких запросов на чтение / запись) У меня есть вопрос по поводу последней части, я хочу сделать указатель на данные контейнера, а затем сказать контейнеру, что он больше не заботится о своих данных.Так что-то вроде семантики перемещения.
std::vector<int> v = {9,8,7,6,5,4,3,2,1,0};
std::vector<int> _v(std::move(v));
Где _v
имеет все значения v
и v
, оставленные в безопасном состоянии.
Проблема в том, что я просто делаю указатель для v.data()
после окончания срока действия контейнера данные, указанные указателем, высвобождаются вместе с контейнером.Например:
// I would use span to make sure It's a sequential container
// but for simplicity i use a raw pointer
// gsl::span<int> s;
int *p;
{
std::vector<int> v = {9,8,7,6,5,4,3,2,1,0};
// s = gsl::make_span(v);
p = v.data();
}
for(int i = 0; i < 10; ++i)
std::cout << p[i] << " ";
std::cout << std::endl;
Теперь p
содержит некоторое количество памяти, и мне понадобится память, ранее принадлежавшая вектору.
Я также пытался v.data() = nullptr
, но v.data()
- это значение.поэтому невозможно назначить его.У вас есть какие-либо предложения, или это возможно?
edit .: Чтобы было более понятно, чего я пытаюсь достичь:
class readbuf_type
{
struct item_type // representation of a chunk
{
uint8_t * const data;
size_t size;
inline item_type(size_t psize)
: size(psize)
, data(new uint8_t[psize])
{}
template <std::ptrdiff_t tExtent = gsl::dynamic_extent>
inline item_type(gsl::span<uint8_t,tExtent> s)
: size(s.size())
, data(s.data())
{}
inline ~item_type()
{ delete[] data; }
};
std::list<item_type> queue; // contains the memory
public:
inline size_t read(uint8_t *buffer, size_t size); // read from queue
inline size_t write(const uint8_t *buffer, size_t size); // write to queue
inline void *get_chunk(size_t size)
{
queue.emplace_back(size);
return queue.back().data;
}
template <std::ptrdiff_t tExtent = gsl::dynamic_extent>
inline void put_chunk(gsl::span<uint8_t,tExtent> arr)
{
queue.emplace_back(arr);
}
} readbuf;
У меня есть функция get_chunk
, чтов основном просто выделяет память с размером, и у меня есть put_chunk
, с чем я борюсь, причина, по которой мне это нужно, потому что перед тем, как вы сможете писать в эту очередь, вам нужно выделить память, а затем скопировать все элементы из буфера (вектор, массив) вы пытаетесь записать из очереди.Примерно так:
std::vector<int> v = {9,8,7,6,5,4,3,2,1,0};
// instead of this
readbuf.get_chunk(v.size);
readbuf.write(v.data(), v.size());
// we want this
readbuf.put_chunk({v});
Поскольку мы разрабатываем для распределенных систем, память имеет решающее значение, и поэтому мы хотим избежать ненужного выделения, копирования.
ps.Это мой первый пост,извините, если я не был точным с самого начала ..