给出以下函数:
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
为什么编译器会为第一个示例生成析构函数调用