为什么我在处理 JPG 文件时会出现内存错误?
Why do I get memory errors when mmap()'ing a JPG file?
我有以下代码部分:
char*
Sender::PrepareData(char* filename, unsigned long long int bytesToTransfer)
{
int fd, pagesize;
char *data;
ifstream file(filename, ios::binary | ios::ate);
int size = file.tellg();
cout << "File Size: " << size << endl;
if(size < bytesToTransfer)
{cout << "File smaller than specified number of bytes {" << bytesToTransfer << "} to transfer -- Exiting!n"; exit(1);}
fd = open(filename, O_RDONLY);
if (fd==NULL) {fputs ("File error",stderr); exit (1);}
cout << "File Open: " << filename << endl;
pagesize = getpagesize();
cout << "Pagesize: " << pagesize << endl;
data = static_cast<char*>(mmap((caddr_t)0, bytesToTransfer, PROT_READ, MAP_SHARED, fd, 0));
if (*data == -1) {fputs ("Memory error",stderr); exit (2);}
return data;
}
这似乎适用于文本和.deb文件——然而,当尝试使用大约3MB的图像文件(.jpg)时,我会遇到内存错误:
File Size: 3333840
File Open: t1.jpg
Pagesize: 4096
Memory error[Inferior 1 (process 3293) exited with code 02]
我用错mmap()
了吗?我正在尝试编写一个简单的包装器,它将接受任何类型的文件,并返回一个包含指定字节数的char*。
您应该只检查data == -1
(或者更好的是,检查MAP_FAILED
),而不是检查*data == -1
(此处通过*
取消引用是错误的)。
代码失败的原因是每个JPEG文件的第一个字节是十六进制的FF
或带符号十进制的-1。
有关JPEG的更多详细信息,请在谷歌上搜索"JPEG文件格式"。例如,在此页面上搜索"SOI"。
相关文章:
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- 为什么删除分配的阵列会导致内存错误?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 需要找到3个小错误-内存错误
- 从'deleted function'获取内存错误
- OpenGL, GLFW, GLAD. glViewport(0, 0, 800, 600) 抛出内存错误
- 销毁 std::queue 会导致内存错误
- 加速进程间:管理共享内存错误
- 删除映射中的指针会导致内存错误
- 由于从 std::map 派生的类中的 std::map 迭代器导致的内存错误
- 当我用clang编译代码时,GCOV会出现内存错误
- 查找素数和时出现内存错误
- 循环链表的内存错误:未分配正在释放的指针
- 为什么我会因Valgrind遇到内存错误?(C ,抽象语法树评估)
- 我如何解析包含65k行的代码的文件,导致[BCC32致命错误] F1008出于内存错误
- 动态内存错误
- 内存错误C 私有INT
- 无法在 Mac OS X 上分配内存错误 - java(xx,xx) malloc: *** mmap(size=XX)
- 类对象的可变级别内存错误检测