繁体   English   中英

为什么在调用隐式类型转换构造函数后直接使用析构函数?

[英]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();

您正在执行以下操作:

  1. 构造一个新的Allocator临时对象
  2. 调用Allocator的拷贝构造函数,其中rhs是临时的
  3. 销毁在第1点创建的临时对象

您可能会考虑两种可能的操作,这可能会导致SIG SEV:复制构造函数和析构函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM