0

私は次のものを持っています:

#include <boost\interprocess\mapped_region.hpp>
#include <boost\interprocess\file_mapping.hpp>

using namespace std;

void GetFileContents(const char* FilePath, size_t& size, char* data);

int main(){
    char* data = 0;
    const char* FilePath = "My\\Path\\File";
    size_t size = 0;
    GetFileContents(FilePath, size, data);
    //Now data is incorrect
    return 1;
}

void GetFileContents(const char* FilePath, size_t& size, char* data){
    file_mapping fm(FilePath, read_only);
    mapped_region region(fm, read_only);
    data = static_cast<char*>(region.get_address());
    //data is correct here
    size = region.get_size();
}

GetFileContents()内dataは正しい情報です。ただし、 ()dataから戻った後GetFileContentsは何も含まれていません。私は何を間違っていますか?

また、を削除する方法はありstatic_castますか?

4

2 に答える 2

1

この関数では:

void GetFileContents(const char* FilePath, size_t& size, char* data){
    file_mapping fm(FilePath, read_only);
    mapped_region region(fm, read_only);
    data = static_cast<char*>(region.get_address());
    ...
}

fmおよびregionは、自動保存期間を持つオブジェクトであり、実行が範囲外になるとその有効期間は終了します。これらのオブジェクトが破棄された後に内部を使用すると、未定義の動作が発生します。

別の問題は、実際にポインター自体を変更しようとしていることです。つまり、関数が取る必要がchar** dataPtrあり、呼び出す必要がありますGetFileContents(FilePath, size, &data);

ただし、C++ を使用してstd::stringいるため、null で終わる文字列を使用していないため、orの使用を検討する必要std::vector<char>があります。より適切な場合があります。

void GetFileContents(const char* FilePath, std::vector<char>& content){
    file_mapping fm(FilePath, read_only);
    mapped_region region(fm, read_only);
    content.resize(region.get_size());
    char* src = static_cast<char*>(region.get_address());
    memcpy(&content[0], src, content.size());
}
于 2013-09-14T00:33:44.973 に答える
1

その時点でデータが正しい唯一の理由は、今では region.get_address() が指すものは何でも指しているためです。fm と region は、GetFileContents() が返されるときにスコープを失うため、破棄されます。

あなたがする必要があるのは、データを region.get_address() からデータにコピーすることです。

size = region.get_size()
memcpy(data, region.get_address(), size)

ただし、その前に、データを事前に割り当てるか (メインなど)、何らかの方法でデータを返し (実際に返すか、参照/ポインターで渡す)、GetFileContents() に割り当てる必要があります。

GetFileContents を呼び出す前に size_t サイズにデータを割り当てたと仮定すると、次のように実行できます。

char* GetFileContents(...) {
  ...
  memcpy(data, region.get_address(), size)
  size = region.get_size()
  ...
  return data
}


int main() {
  ...
  size_t fileSize = 1024; //maximum size
  char* data = new char[fileSize];
  GetFileContents("file.dat", fileSize, data)
  // now fileSize is the real file size
  ...
}
于 2013-09-14T00:33:52.580 に答える