這幾天在寫aio + epoll 代碼,使用aio必須要字節對齊,因此需要用到posix_memalign()這個類似malloc()、alloc()等開闢內存的函數,函數原型:
int posix_memalign (void **memptr,
size_t alignment,
size_t size);
posix_memalign( )成功時會返回size字節的動態內存,並且這塊內存的地址是alignment的倍數。但是由於我操作失誤,posix_memalign(&buf[i], 521, 1024);程序還沒有報錯,表示申請成功的,最後free就爆炸。下面的測試代碼(和aio+epoll代碼中的情況一樣)
用valgrind,gdb調試半天,posix_memalign()函數的資料查了半天,
還是找不出原因,最後絕望的時候一瞥,泥煤呀,下意識的512直接寫成521。
結論:
1. posix_memalign()這個函數有缺陷,按照道理size不能整除alignment 或者 alignment不是2的冪就應該報錯啊,而不是還給你申請成功,最後還可以使用,只不過free就爆炸。
2. 作爲程序猿,不好好記住512,下意識的直接在測試代碼中寫521,也是醉了,而且還是連續兩次寫521。