![](/img/trans.png)
[英]Expected constructor, destructor, or type conversion before '*' token
[英]Why is a destructor directly after calling an implicit type conversion constructor?
提供以下功能:
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
为什么编译器会为第一个示例生成析构函数调用
Allocator myAllocator = shm.allocator();
是复制初始化,涉及转换构造函数(来自osal_allocator*
)和复制构造函数(来自临时Allocator
)的调用。 被调用的析构函数是临时Allocator
对象的析构函数。
崩溃可能是由于缺少了复制构造函数,或者是Allocator
实现不当的复制构造函数。
这可以通过将初始化更改为的声明来支持
Allocator myAllocator( shm.allocator );
工作 - 这是因为没有涉及复制 - 直接调用转换构造函数,不创建临时对象。
基本上,如果一个类需要析构函数,复制构造函数或复制赋值运算符(当类管理资源时通常就是这种情况),它需要所有这三个 。
有了这条线
Allocator myAllocator = shm.allocator();
您正在执行以下操作:
Allocator
临时对象 Allocator
的拷贝构造函数,其中rhs是临时的 您可能会考虑两种可能的操作,这可能会导致SIG SEV:复制构造函数和析构函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.