ant*_*_rh 97 c++ malloc undefined-behavior c++20
有人告诉我,以下代码在 C++20 之前具有未定义的行为:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Run Code Online (Sandbox Code Playgroud)
真的吗?
论点是int对象的生命周期在为其分配值之前没有开始(P0593R6)。要解决此问题,new应使用放置:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Run Code Online (Sandbox Code Playgroud)
我们真的必须调用一个微不足道的默认构造函数来启动对象的生命周期吗?
同时,代码在纯 C 中没有未定义的行为。但是,如果我int在 C 代码中分配 an并在 C++ 代码中使用它呢?
// C source code:
int *alloc_int(void)
{
int *p = (int*)malloc(sizeof(int));
*p = 10;
return p;
}
// C++ source code:
extern "C" int *alloc_int(void);
auto p = alloc_int();
*p = 20;
Run Code Online (Sandbox Code Playgroud)
它仍然是未定义的行为吗?
Bar*_*rry 62
这是真的吗?
是的。从技术上讲,不属于:
int *p = (int*)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)
实际上创建了一个 type 的对象int,所以取消引用p是 UB 因为那里没有实际的int。
我们真的必须调用默认构造函数来启动对象的生命周期吗?
您是否必须按照 C++ 对象模型来避免 C++20 之前的未定义行为?是的。如果您不这样做,任何编译器实际上会造成伤害吗?不是我所知道的。
[...] 它仍然是未定义的行为吗?
是的。在 C++20 之前,您实际上还没有int在任何地方创建对象,所以这是 UB。
Yak*_*ont 43
是的,是UB。列举了一个int可以存在的方式列表,没有一个适用于那里,除非你认为 malloc 是因果关系。
它被广泛认为是标准中的一个缺陷,但不是一个重要的缺陷,因为 C++ 编译器围绕 UB 的特定部分所做的优化不会导致该用例出现问题。
至于第二个问题,C++ 并没有强制要求 C++ 和 C 如何交互。所以所有与 C 的交互都是...... UB,也就是 C++ 标准未定义的行为。