2014-10-06 90 views
6

我一直在使用本徵在我的軟件,我今天碰到的一個問題,造成從建立在靜態庫動態庫改變我的代碼Windows,使用Visual Studio 2013.此開關的原因與Eigen無關。內存對齊錯誤2013

我嵌入徵在自己的庫文件,其本身然後鏈接到我的應用程序(一個或多個)。如前所述,這個圖書館直到今天一直是一個靜態圖書館;我剛更新我的代碼庫來生成一個DLL文件。

由於此更改,我現在從Visual Studio收到以下錯誤信息:

功能塊在--------------------被由對齊例程分配,使用_aligned_free()

(這個消息每次彈出多次不同的地址;我用上面的破折號,因爲我不認爲具體的地址與這個問題有關)。

選擇「重試」打開調試器對Memory.h

視覺工作室智能感知(未調試時)線255表明,EIGEN_ALIGN和EIGEN_HAS_MM_MALLOC都定義爲1,EIGEN_MALLOC_ALREADY_ALIGNED和EIGEN_HAS_POSIX_MEMALIGN都是未定義的。因此,它應該運行_mm_free(ptr),它(基於IntelliSense的再次)是_aligned_free(a)的別名。因此,看起來這個代碼應該運行正確的功能,但事實並非如此。

當我更改代碼回靜態庫,這個問題就會消失。

我從衆多的Google搜索中發現的唯一遠程相關內容是英特爾Fortran編譯器的一篇文章,它說這個錯誤消息可能來自於一個庫,它是在早期版本中編譯的,並由最新版本編譯的代碼調用。除了我正在使用Visual Studio C++ 2013的事實之外,我已經多次重新編譯代碼,以確保它完全從乾淨狀態重新編譯,並且此錯誤消息仍然存在。

我已經從網上下載善變回購(默認分支)最新的代碼,但這並沒有解決問題。

我試圖像徹底,因爲我可能會。如果您需要更多信息,請告訴我。

編輯:

此外上下文:

'客戶代碼',其利用在這種情況下,DLL是谷歌測試;在測試期望值之後引發錯誤消息 - 即DLL文件中的類正在運行析構函數來清理臨時對象。在驅動程序的應用程序,我沒有試圖做這樣的DLL文件分配內存,邪惡的東西,然後解除分配 - 這是部分原因,我覺得這是這麼混亂....

+0

你確定DLL和使用該DLL的客戶端已經構建相同嗎?我正在大聲思考 - 現在它是獨立的,DLL正在做mallocs並以一種方式釋放,客戶端可以做其他事情。通常由於這個原因,它不適合客戶端在DLL中創建的對象上調用free。通常你從DLL中導出清理(即免費)例程,以便客戶端可以調用這些例程而不是直接執行。對象創建也是如此。 – 2014-10-06 19:29:28

+0

@MichaelPetch我很確定他們是一樣的。當然,DLL和靜態庫是相同的(我只改變一個設置)。另外 - 我沒有從客戶端免費調用 - 有問題的代碼是DLL清理代碼。就我而言,客戶端是Google Test,它正在對庫中的代碼進行單元測試;在應該調用臨時特徵矩陣析構函數的地方達到了斷點。我會更新這個問題並澄清這一點,以利於他人。我看到這在之前並不清楚。 – 2014-10-06 20:03:48

回答

2

我有這個確切的問題。我將使用Eigen的靜態庫轉換爲DLL,並在使用gtest進行單元測試時開始出現這些錯誤。由於沒有解決方案,我會提供我所做的解決問題的方法。本質上,問題在於你已經創建了一個包含Eigen矩陣/向量作爲成員變量的類的新接口,並且該接口使用Eigen成員變量創建了一個指向類的指針。首先,如果你有成員變量是特徵矩陣或向量,那麼你應該閱讀this。總之,你需要添加

市民: EIGEN_MAKE_ALIGNED_OPERATOR_NEW

到您使用本徵成員變量的類定義。如果您使用的是Visual Studio編譯器,那麼您可能還會收到有關warning C4316: object allocated on the heap may not be aligned 16的警告。

現在,我使用EIGEN_MAKE_ALIGNED_OPERATOR_NEW後仍然有問題,這是由於使用原子與特徵矩陣類;作爲成員變量的boost::atomic<Eigen::MatrixXf>。我想在保證原子性時對齊是非常重要的。