gpt4 book ai didi

c++ - 我们可以依靠任何基于内存布局和默认析构函数的保证吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:43 25 4
gpt4 key购买 nike

不久前我们有这个声明(简化版):

声明 1

struct SomeType
{
// allocates Implementation in SomeType's TU
SomeType();
// ... other stuff
struct Implementation
{
std::string someAtribute1;
std::string someAtribute2;
}
std::auto_ptr< Implementation> pimpl;
};

一段时间后,我们将 de 声明更改为(简化):

声明 2

class OtherNameImplementation;

struct SomeType
{
// allocates OtherNameImplementation in SomeType's TU
SomeType();
// ... other stuff
std::auto_ptr< OtherNameImplementation> pimpl;
};

OtherNameImplementationSomeType 的 TU 中定义,并且与 SomeType::Implementation 具有完全相同的定义(在声明 1 中).

不知何故,我们错过了 SomeType 没有定义的析构函数,因此编译器生成的析构函数是在用户的 TU 中定义的。

问题:

对于根据“声明 1”编译的 TU,在运行时使用“声明 2”时,是否有任何形式的行为“正确”的保证。

我能想到的原因有两个,它至少看起来“有效”:

  1. 编译器生成的析构函数应该做“正确的事情”,因为两种实现类型的内存布局是相同的,即使类型的名称已更改。

  2. 我们在测试期间没有注意到任何影响(有数百个应用程序具有这种依赖性)

我们的目标平台是 Solaris,我们使用 Sunstudio 12。

不知何故,我们在代码审查期间错过了这一点,我知道这至少是 UB,在一个完美的世界中,我们将为 SomeType 定义一个析构函数,并重新编译依赖于此的每个 TU。

更新:

我在 comp.lang.c++ 上“交叉发布”了这个,Alf P. Steinbach 让我意识到 TU 针对“声明 2”编译的内容正在泄漏内存(这相当令人尴尬)。基于此,我们将恢复到“声明 1”并重新编译针对“声明 2”编译的每个域,因此我们没有 header 或 ABI 解耦 :) 但我们处于有效状态。我们将在下一个发布周期中修复此问题。

最佳答案

如果没有基类/派生类并且没有虚函数,那么您提到的覆盖保证是好的。

我不认为你被允许假设 std::auto_ptr 或 std::string 满足那个。

关于c++ - 我们可以依靠任何基于内存布局和默认析构函数的保证吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com