Возвращение файла boost :: interprocess memory-mapped из функции?

Как я могу поместить этот код в функцию, чтобы я передал путь к файлу, и он возвращает байты, сопоставленные с файлом, в массив char? Всякий раз, когда я пытался, я никогда не смогу прочитать содержимое после завершения функции?

using boost::interprocess;
using boost;

boost::shared_ptr<char> getBytes(const char* FilePath){
shared_ptr<file_mapping> fm(new file_mapping(FilePath, read_only));
shared_ptr<mapped_region> region(new mapped_region(*fm, read_only));
shared_ptr<char> bytes(static_cast<char*>(region->get_address()));
return bytes;
}

0

Решение

Вы, вероятно, должны идти о своей цели совсем по-другому! Ясно вы не хочу просто delete указатель на отображенный массив памяти, который является то, что boost::shared_ptr<char> инициализируется указателем на базовый адрес. На самом деле, вы, вероятно, должны не отпустить этот указатель на всех.

Два других объекта, которые вы создадите, выйдут из области видимости, когда getBytes() выход, но это объекты, которые на самом деле цепляются за общую память. Что ты может быть хочу сделать, это поставить file_mapping и mapped_region вместе в объект, который помещается в возвращаемый boost::shared_ptr<char> как объект удаления: таким образом эти два объекта будут жить достаточно долго, чтобы поддерживать указатель на массив. После вызова функции удаления два объекта будут освобождены. Вот как это выглядит примерно, хотя я не проверял, действительно ли это правильные интерфейсы:

struct shared_memory_deleter
{
shared_memory_deleter(char const* file)
: d_fm(new file_mapping(file, read_only))
, d_region(new mapped_region(*fm, read_only))
{
}
void operator()(char*) {
this->d_region.reset(0);
this->d_fm.reset(0);
}
shared_ptr<file_mapping>  d_fm;
shared_ptr<mapped_region> d_region);
};

boost::shared_ptr<char> getBytes(const char* FilePath){
shared_memory_deleter deleter(FilePath);
shared_ptr<char> bytes(deleter.d_region->get_address(), deleter);
return bytes;
}

Я не уверен, что это сработает, но у него есть, по крайней мере, шанс. Вероятно, не очень хорошая идея делать что-то подобное. Вместо этого вам, вероятно, гораздо лучше обернуть логику в объект и вообще не использовать какие-либо общие указатели:

class shared_memory
{
public:
shared_memory(char const* name)
: d_file(name, read_only)
, d_region(d_file, read_only)
{
}
char const* buffer() const { return d_region.get_address(); }
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]