關於posix_memalign( )函數的坑

            這幾天在寫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。




    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章