libpng-内存错误导致崩溃[iOS和Android]

libpng-内存错误导致崩溃[iOS和Android],ios,android-ndk,heap-memory,libpng,memory-corruption,Ios,Android Ndk,Heap Memory,Libpng,Memory Corruption,我在iOS和Android NDK项目中都使用libpng版本1.6.15来读取.png图像,并将其用于OpenGL ES 2.0纹理。我已经配置了libpng,没有错误,下面是我读取PNG图像的代码: uint8_t *outputData; FILE *fp = fopen(filename, "rb"); png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png)

我在iOS和Android NDK项目中都使用libpng版本1.6.15来读取.png图像,并将其用于OpenGL ES 2.0纹理。我已经配置了libpng,没有错误,下面是我读取PNG图像的代码:

uint8_t  *outputData;
FILE *fp = fopen(filename, "rb");

png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(!png) abort();

png_infop info = png_create_info_struct(png);
if(!info) abort();

if(setjmp(png_jmpbuf(png))) abort();

png_init_io(png, fp);

png_read_info(png, info);

width      = png_get_image_width(png, info);
height     = png_get_image_height(png, info);
color_type = png_get_color_type(png, info);
bit_depth  = png_get_bit_depth(png, info);

texWidth = width;
texHeight = height;

if(bit_depth == 16)
    png_set_strip_16(png);

if(color_type == PNG_COLOR_TYPE_PALETTE)
    png_set_palette_to_rgb(png);

if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
    png_set_expand_gray_1_2_4_to_8(png);

if(png_get_valid(png, info, PNG_INFO_tRNS))
    png_set_tRNS_to_alpha(png);

if(color_type == PNG_COLOR_TYPE_RGB ||
   color_type == PNG_COLOR_TYPE_GRAY ||
   color_type == PNG_COLOR_TYPE_PALETTE)
    png_set_filler(png, 0xFF, PNG_FILLER_AFTER);


if(color_type == PNG_COLOR_TYPE_GRAY ||
   color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
    png_set_gray_to_rgb(png);

png_read_update_info(png, info);
unsigned  long row_bytes = png_get_rowbytes(png,info);
outputData = (uint8_t*) malloc(row_bytes * height * 4); // Allocating memory

row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height);
for(int y = 0; y < height; y++) {
    row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png,info));
}
png_read_image(png, row_pointers);
for(int i = 0; i < height; i++) {
    //memcpy(outputData+(row_bytes * (height-1-i)), row_pointers[i], row_bytes);
    memcpy(outputData+(row_bytes * i), row_pointers[i], row_bytes);
}
printf("Allocating memory ... ");
//png_destroy_info_struct(png, &info);
//free(row_pointers);
fclose(fp);

return  outputData;
它有时在Android NDK项目中工作,正确读取图像以使纹理完美,但大多数情况下,应用程序在读取带有以下消息的数据后崩溃:

glGenTextures(1, &OGLTextureName);
glBindTexture(GL_TEXTURE_2D, OGLTextureName);
glTexImage2D(GL_TEXTURE_2D, 0,getOGLTextureFormat(format), width, height, 0, getOGLTextureFormat(format), getOGLTextureType(texelType), outputData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
free(outputData);
在iOS中:

malloc: *** error for object 0x16884844: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
在Android中

heap corruption detected by dlfree

我做错了什么?我还尝试在
malloc\u error\u break
中设置断点,但这对我没有帮助。这是因为图像中存在块吗?

您没有检查malloc()是否成功(outputData!=NULL,row_指针[y]!=NULL)。您的outputData数组是需要的四倍大(rowbytes的宽度已经是*4)。@GlennRanders Pehrson感谢您的回复。我已经做了更改,并验证了是否为这些对象分配了内存,仍然是同一个问题。@GlennRanders Pehrson抱歉,我发现了问题,是文件名,char[]在调用时没有正确分配。修好了。工作得很好。再次感谢你。