一段時間以來,我一直在嘗試使用C++將內存寫入文件緩衝區時遇到了一個非常奇怪的問題。這個問題只發生在MinGW上。當我在gcc/linux下編譯時,一切都很好。如何將內存寫入文件緩衝區進行變異?
Debugging Session displaying the problem
所以基本上,我正在寫從內存緩衝區代碼爲filebuffer,並在文件中的二進制表示最終被從我寫的內存不同。不,該文件稍後沒有被修改,我通過在關閉文件後使用調試器退出程序來保證這一點。我不知道這樣的事情甚至是可能的,我甚至用valgrind來查看是否有任何內存分配問題,但不是。
我會粘貼一些相關的代碼。
/// a struct holding information about a data file
class ResourceFile {
public:
string name;
uint32 size;
char* data;
ResourceFile(string name, uint32 size);
};
ResourceFile::ResourceFile(string name, uint32 size)
: name(name), size(size)
{
// will be free'd in ResourceBuilder's destruction
data = (char*) malloc(size * sizeof(char));
}
/// Build a data resource from a set of files
class ResourceBuilder {
public:
ofstream out; ///< File to put the resource into
vector<ResourceFile> input; ///< List of input strings
/// Add a file from disk to the resource
void add_file(string filename);
/// Create a file that the resource will be written to
void create_file(string filename);
~ResourceBuilder();
};
void ResourceBuilder::create_file(string filename) {
// open the specified file for output
out.open(filename.c_str());
uint16 number_files = htons(input.size());
out.write((char*) &number_files, sizeof(uint16));
foreach(vector<ResourceFile>,input,i) {
ResourceFile& df = *i;
uint16 name_size = i->name.size();
uint16 name_size_network = htons(name_size);
out.write((char*) &name_size_network, sizeof(uint16));
out.write(i->name.c_str(),name_size);
uint32 size_network = htonl(i->size);
out.write((char*) &size_network, sizeof(i->size));
out.write(i->data, i->size);
}
out.close();
/// \todo write the CRC
}
以下是如何分配內存的第一個地方。這是一個可能的錯誤來源,因爲我從別處拷貝了它而沒有詳細地理解它,但我真的不知道如何分配內存的方法可能是文件緩衝區輸出不同於內存的原因我正在寫作。
void ResourceBuilder::add_file(string filename) {
// loads a file and copies its content into memory
// this is done by the ResourceFile class and there is a
// small problem with this, namely that the memory is
// allocated in the ResourceFile directly,
ifstream file;
file.open(filename.c_str());
filebuf* pbuf=file.rdbuf();
int size=pbuf->pubseekoff (0,ios::end,ios::in);
pbuf->pubseekpos (0,ios::in);
ResourceFile df(filename,size);
pbuf->sgetn (df.data,size);
file.close();
input.push_back(df);
}
我真的沒有想法。這也不是與我的編譯器設置有關的錯誤,因爲編譯MinGW下的代碼的其他人也會得到相同的錯誤。我現在唯一能想到的解釋是MinGW的filebuffer庫本身存在一個bug,但我真的不知道。
量子力學! –