2012-12-07 26 views
1

我在項目的嵌套子文件夾中有不少源文件。我有4個不同的類,我試圖替換,並且想要找到它們被分配的源代碼中的每個地方(堆+堆棧)。正則表達式/ grep/findstr用於定位內存分配C++

不幸的是,由於糟糕的包含結構,Visual Studio的「搜索整個解決方案」功能是不可信的,所以我在源文件中採用了手動搜索。

我相信是足夠了:

"new CLASS1("與三個令牌那裏堆和 "^CLASS2",我想說的類名稱開始在該行的開頭(不計空格之間的空間任意組合)用於堆棧分配。

對於堆棧分配,[^a-zA-Z] CLASS3 [a-zA-Z]+嘗試過,但我不太流利的正則表達式,所以想通過SO運行這個。對於堆,只是上面的字符串被嘗試過,但我知道一個簡單的額外空間會打破該模式,所以我知道這是不正確的。

任何人都可以想出一個更好的匹配器甚至是一個更好的方法去解決這個問題嗎?

謝謝

AK

+2

第三個沒有意義,並且所有這些都在模板或typedef的存在下失敗。我的解決方案是重命名所有的類,編譯器錯誤會告訴你它在哪裏使用。 –

+0

@MooingDuck是的,不知道爲什麼它不僅僅是CLASS3之前的空間角色,而是想確保我不會隨意猜測。沒有爲這些類聲明的模板或typedefs,也沒有任何繼承類型問題。我的確在考慮重命名這些類,但這些都非常重要,並且可以在任何地方使用。幾乎每一行都不會中斷(即使是非分配行? - 類,結構,聯合期望之前 - >等)? –

+1

是的,但是如果您要替換它們,那麼_first_錯誤將始終是一段代碼你必須改變。(你也許會想找到成員,但你的「堆棧分配」正則表達式可能會選擇這個) –

回答

2

使構造函數爲私有,並且每次嘗試創建對象時都會收到錯誤消息。

讓一個私有的new()操作符對堆分配執行相同的技巧。

編輯:小心INSIDE類的實現(包括靜態方法)創建自己的實例。從這樣的上下文調用私有構造函數是有效的,不會觸發錯誤。還要注意朋友的課程/功能。

+0

AHA!這聽起來有希望!任何人都可以確認這會捕獲所有的實例嗎? –

+0

其實,如果你讓所有的構造函數都是私有的(包括3個內建函數),那麼這應該是完美的,只要沒有朋友函數創建新的實例。你實際上並不需要讓'新'私人,這實際上並沒有什麼幫助。 –

+2

@MooingDuck:我認爲'new()'的建議是使用'operator new'和'operator new []'的訪問控制來選擇性地阻止動態分配的想法的一個混亂版本。同樣,限制訪問析構函數可以用來有選擇地防止非動態分配。限制對構造函數的訪問涉及兩種情況,沒有任何權力來區分它們。 –

2

一種保證方式,以確保您消除類的所有用法是簡單地刪除類的定義或做出它的一些關鍵部分無效。然後當你編譯這個項目時,你將會得到一個關於類被使用的每種情況的錯誤。當所有東西都被成功編譯後,你會知道所有的東西都被替換了。

你當然可以通過使用查找/替換的簡單情況加快一點點,然後手動修復任何剩餘的情況。

+1

+1而感到困惑。 –