Как я могу поместить этот код в функцию, чтобы я передал путь к файлу, и он возвращает байты, сопоставленные с файлом, в массив 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;
}
Вы, вероятно, должны идти о своей цели совсем по-другому! Ясно вы не хочу просто 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(); }
};
Других решений пока нет …