gpt4 book ai didi

c++ - 交换包含不可平凡复制类型的 `std::aligned_storage` 实例 - 未定义的行为?

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:13 24 4
gpt4 key购买 nike

ideone link

#include <iostream>
#include <type_traits>
using namespace std;

// Non-trivially-copyable type.
struct NTC
{
int x;
NTC(int mX) : x(mX) { }
~NTC() { cout << "boop." << x << endl; }
};

int main()
{
using AS = aligned_storage_t<sizeof(NTC), alignof(NTC)>;

// Create two `std::aligned_storage` instances
// and "fill" them with two "placement-new-constructed"
// `NTC` instances.
AS as1, as2;
new (&as1) NTC{2};
new (&as2) NTC{5};

// Swap the `aligned_storages`, not their contents.
std::swap(as1, as2);

// Explicitly call `~NTC()` on the contents of the
// aligned storage instances.
NTC& in1{*static_cast<NTC*>(static_cast<void*>(&as1))};
NTC& in2{*static_cast<NTC*>(static_cast<void*>(&as2))};
in1.~NTC();
in2.~NTC();

return 0;
}

上面的代码是未定义的行为吗?

这是我认为正在发生的事情:

  • NTC 是一种不可平凡复制的类型。
  • 我正在创建两个适合存储 NTC 对象的内存位置 (std::aligned_storage)。
  • 我将两个 NTC 实例直接构建到内存位置。
  • std::aligned_storage instances are PODTypes .

    This means the type is compatible with the types used in the C programming language, can be manipulated using C library functions: it can be created with std::malloc, it can be copied with std::memmove, etc, and can be exchanged with C libraries directly, in its binary form.

  • 由于对齐的存储实例是 POD 类型,我应该被允许移动/交换/复制它们。
  • 交换对齐存储实例意味着从对齐存储 A 中取出所有字节,并将它们与对齐存储 B 中的所有字节交换
  • 这样做不会调用内部存储的 NTC 对象的析构函数/复制构造函数。

我的任何观点是否不正确?如果确实发生了未定义的行为,它发生在程序的哪一部分?为什么?


可能正确/不正确信息(gathered from a deleted answer):

我在这些新假设中是否犯了任何错误?

最佳答案

在将不可平凡复制的类型放入缓冲区后直接访问缓冲区的字节是一个非常糟糕的主意,但还不是未定义的。

在作为 NTC 交换后尝试访问缓冲区违反了别名规则,[basic.lval]p10:

If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined:

(10.1) -- the dynamic type of the object,

[....]

通过 memcpy 或等价物复制可简单复制的类型意味着保留动态类型。对于非平凡可复制的类型没有这样的暗示,所以在交换之后,您不再有任何 NTC 对象可以访问。

关于c++ - 交换包含不可平凡复制类型的 `std::aligned_storage` 实例 - 未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29317981/

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