次の関数を与えます。
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
line では無効であることを意味します。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
最初の例でコンパイラがデストラクタ呼び出しを生成するのはなぜですか