給下面的函數:爲什麼在調用隱式類型轉換構造函數後直接析構函數?
osal_allocator* SharedMemoryManager::allocator();I
凡osal_allocator
是一個 'c' 的結構,含函數指針。
而包裝類,提供了下面的構造:
Allocator::Allocator(osal_allocator*);
函數作出如下呼叫:
001 SomeFunc(SharedMemoryManager* shm)
002 {
003 Allocator myAllocator = shm.allocator();
004
005 myAllocator.doSomething();
006
007 // stuff
008 }
代碼失敗,出現SIG SEGV
。原因是在線003
myAllocator
的析構函數在其構造函數被調用後立即被調用。這意味着myAllocator
在線路005
上無效,因爲它已被銷燬。
(注意:默認構造函數沒有被調用,也沒有任何賦值運算符)。
如果線003
改爲:
003 Allocator myAllocator(shm.allocator);
功能正常工作,與myAllocators
的析構函數沒有被調用,直到它超出範圍。
不幸的是,我無法用一個簡單的例子重現此問題。
我使用:
g++ (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)
通過以下選項:
c++ -MD -D__LINUX__ -g -ansi -Wall -Wextra -Wformat -Wno-format-security -Woverloaded-virtual -Iinc
爲什麼編譯器生成的析構函數調用的第一個例子
您的問題的答案是,您需要正確並正確地遵循**三條規則**。 –
請發佈*實際的最小完整代碼*,而不僅僅是一些近似值。你的代碼不會編譯。 –
「爲什麼編譯器爲第一個示例生成無效代碼」的可能性非常高,事實並非如此。 – PlasmaHH