#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*** 單元格矩陣長寬均有多少個單元**/
int mMatrixLength = 0;
/* 每個單元格的長寬 */
float mMapUnitLength = 0.2;
/*地圖資料結構 */
struct mapUnit
{
float *texCoor; //控制在框內怎么填充圖片
float *vertices; //頂點,x,y,z,x,y,z
char *filePath; //當前加載的圖塊的filePath
char *pixels; //圖塊像素
char drawFinished; //加載的圖塊變更后,標記是否已加載對應像素到結點
};
typedef struct mapUnit MapUnit;
//圖塊矩陣(二維指標)
MapUnit *mMapUnitMatrix;
void init(){
//創建地圖(有問題,偶發性閃退)
mMatrixLength = 4; //原坐標移動到左上角,所以畫面長寬變成了2f。加1是為了橫向縱向都多一行不可見緩沖邊
mMapUnitMatrix = (MapUnit*) malloc(sizeof(MapUnit) * mMatrixLength * mMatrixLength);
int i;
for (i = 0; i < mMatrixLength * mMatrixLength; i++)
{
MapUnit unit = mMapUnitMatrix[i];
unit.texCoor = (float *)malloc(sizeof(float) * 12); //賦值統一的TexCoor
unit.vertices = (float *)malloc(sizeof(float) * 18); //賦值每個圖塊單元一個符合自己位置的坐標
unit.drawFinished = 0; //每個新建的圖塊都是沒完成像素填充的
unit.pixels = (char *)malloc(36);
}
printf("init\n");
}
void destroy(){
printf("destroy:%llu\n", mMapUnitMatrix);
int i;
for (i = 0; i < mMatrixLength * mMatrixLength; i++)
{
MapUnit unit = mMapUnitMatrix[i];
free(unit.pixels);
unit.pixels = NULL;
free(unit.vertices);
unit.vertices = NULL;
free(unit.texCoor);
unit.texCoor = NULL;
free(unit.filePath);
}
free(mMapUnitMatrix);
mMapUnitMatrix = NULL;
}
MapUnit getUnit(int x, int y) {
return mMapUnitMatrix[y * mMatrixLength + x];
}
int main()
{
while(1)
{
init();
destroy();
// init();
// destroy();
}
return 0;
}
第二次destory的時候會出現:
init
destroy:94816647983120
init
destroy:94816647983120
*** Error in `./bigMatrix1.bin': free(): invalid pointer: 0x00007f257f3fcb58 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7f257f0d3bfb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7f257f0d9fc6]
/lib/x86_64-linux-gnu/libc.so.6(+0x7780e)[0x7f257f0da80e]
./bigMatrix1.bin(+0x8ff)[0x563c383e58ff]
./bigMatrix1.bin(+0x9e3)[0x563c383e59e3]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7f257f0832e1]
./bigMatrix1.bin(+0x67a)[0x563c383e567a]
======= Memory map: ========
563c383e5000-563c383e6000 r-xp 00000000 08:03 2052556 /media/chenjiezhu/work2/work/project/AndroidProject/AndroidProject/WhiteBoardCJZ/app/test/bigMatrix1.bin
563c385e5000-563c385e6000 r--p 00000000 08:03 2052556 /media/chenjiezhu/work2/work/project/AndroidProject/AndroidProject/WhiteBoardCJZ/app/test/bigMatrix1.bin
563c385e6000-563c385e7000 rw-p 00001000 08:03 2052556 /media/chenjiezhu/work2/work/project/AndroidProject/AndroidProject/WhiteBoardCJZ/app/test/bigMatrix1.bin
563c389f3000-563c38a14000 rw-p 00000000 00:00 0 [heap]
7f2578000000-7f2578021000 rw-p 00000000 00:00 0
7f2578021000-7f257c000000 ---p 00000000 00:00 0
7f257ee4c000-7f257ee62000 r-xp 00000000 08:22 5378864 /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
7f257ee62000-7f257f061000 ---p 00016000 08:22 5378864 /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
7f257f061000-7f257f062000 r--p 00015000 08:22 5378864 /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
7f257f062000-7f257f063000 rw-p 00016000 08:22 5378864 /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
7f257f063000-7f257f1f8000 r-xp 00000000 08:22 5378540 /usr/lib/x86_64-linux-gnu/libc-2.24.so
7f257f1f8000-7f257f3f8000 ---p 00195000 08:22 5378540 /usr/lib/x86_64-linux-gnu/libc-2.24.so
7f257f3f8000-7f257f3fc000 r--p 00195000 08:22 5378540 /usr/lib/x86_64-linux-gnu/libc-2.24.so
7f257f3fc000-7f257f3fe000 rw-p 00199000 08:22 5378540 /usr/lib/x86_64-linux-gnu/libc-2.24.so
7f257f3fe000-7f257f402000 rw-p 00000000 00:00 0
7f257f402000-7f257f425000 r-xp 00000000 08:22 5378088 /usr/lib/x86_64-linux-gnu/ld-2.24.so
7f257f600000-7f257f602000 rw-p 00000000 00:00 0
7f257f621000-7f257f625000 rw-p 00000000 00:00 0
7f257f625000-7f257f626000 r--p 00023000 08:22 5378088 /usr/lib/x86_64-linux-gnu/ld-2.24.so
7f257f626000-7f257f627000 rw-p 00024000 08:22 5378088 /usr/lib/x86_64-linux-gnu/ld-2.24.so
7f257f627000-7f257f628000 rw-p 00000000 00:00 0
7ffccee76000-7ffccee99000 rw-p 00000000 00:00 0 [stack]
7ffccef87000-7ffccef8a000 r--p 00000000 00:00 0 [vvar]
7ffccef8a000-7ffccef8c000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
已放棄
錯誤,但是沒有發現語法問題,可以請問一下這是為什么嗎?
uj5u.com熱心網友回復:
為啥要搞個unit呢?這東西是蛇足,并引起了大部分的錯誤。你的init里面的大量對unit的成員的賦值和你那16個結構體一點關系都沒有。
也就是說init結束的時候你那16個結構體里面的64個指標仍然是野指標。
uj5u.com熱心網友回復:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*** 單元格矩陣長寬均有多少個單元**/
int mMatrixLength = 0;
/* 每個單元格的長寬 */
float mMapUnitLength = 0.2;
/*地圖資料結構 */
struct mapUnit
{
float *texCoor; //控制在框內怎么填充圖片
float *vertices; //頂點,x,y,z,x,y,z
char *filePath; //當前加載的圖塊的filePath
char *pixels; //圖塊像素
char drawFinished; //加載的圖塊變更后,標記是否已加載對應像素到結點
};
typedef struct mapUnit MapUnit;
//圖塊矩陣(二維指標)
MapUnit *mMapUnitMatrix;
void init(){
//創建地圖(有問題,偶發性閃退)
mMatrixLength = 4; //原坐標移動到左上角,所以畫面長寬變成了2f。加1是為了橫向縱向都多一行不可見緩沖邊
mMapUnitMatrix = (MapUnit*) malloc(sizeof(MapUnit) * mMatrixLength * mMatrixLength);
int i;
for (i = 0; i < mMatrixLength * mMatrixLength; i++)
{
#if 0
//MapUnit unit = mMapUnitMatrix[i];
unit.texCoor = (float *)malloc(sizeof(float) * 12); //賦值統一的TexCoor
unit.vertices = (float *)malloc(sizeof(float) * 18); //賦值每個圖塊單元一個符合自己位置的坐標
unit.drawFinished = 0; //每個新建的圖塊都是沒完成像素填充的
unit.pixels = (char *)malloc(36);
#else
MapUnit *unit = mMapUnitMatrix + i;
unit->texCoor = (float *)malloc(sizeof(float) * 12); //賦值統一的TexCoor
unit->vertices = (float *)malloc(sizeof(float) * 18); //賦值每個圖塊單元一個符合自己位置的坐標
unit->drawFinished = 0; //每個新建的圖塊都是沒完成像素填充的
unit->pixels = (char *)malloc(36);
#endif
}
printf("init\n");
}
void destroy(){
printf("destroy:%llu\n", mMapUnitMatrix);
int i;
for (i = 0; i < mMatrixLength * mMatrixLength; i++)
{
MapUnit unit = mMapUnitMatrix[i];
free(unit.pixels);
unit.pixels = NULL;
free(unit.vertices);
unit.vertices = NULL;
free(unit.texCoor);
unit.texCoor = NULL;
free(unit.filePath);
}
free(mMapUnitMatrix);
mMapUnitMatrix = NULL;
}
MapUnit getUnit(int x, int y) {
return mMapUnitMatrix[y * mMatrixLength + x];
}
int main()
{
while(1)
{
init();
destroy();
// init();
// destroy();
}
return 0;
}
供參考~
給沒有malloc的結構體成員釋放空間會出現這種問題。
注意unit是結構體,在malloc的時候,如果用結構體變數而不用結構體指標申請空間,申請的空間只會是結構體變數的,而不是原有的。
uj5u.com熱心網友回復:
繼續,盡管destroy里面的unit也同樣不講究,但用來free卻沒有額外錯誤。然而,憑什么每個結構體四個指標三個malloc,卻又四個free呢?多出來的free肯定要出錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244951.html
標籤:C語言
上一篇:幫我看看這個到底啥意思。
下一篇:怎么做這個求告知,哭唧唧
