我被告知在C++20之前,以下代码存在未定义的行为:
int *p = (int*)malloc(sizeof(int));
*p = 10;
那是真的吗?
争论的焦点在于在给 int
对象赋值之前,它的生命周期尚未开始 (P0593R6)。为了解决这个问题,应该使用放置 new
:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
我们真的需要调用一个对于对象生命周期起始没有实质性作用的默认构造函数吗?
同时,这段代码在纯C中并没有未定义行为。但是如果我在C代码中分配一个 int
并在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;
这仍然是未定义行为吗?
int
类型?不需要。对于std::string
类型?需要。 - Eljayint
类型,也是需要的。只是如果不这样做,在实践中可能不会出现问题。对于std::string
类型,显然会引起问题。 - Barryint *p = (int*)malloc(sizeof(int)); p = new(p) int;
吗? 我曾经意识到不给定内存池的返回值也可能会导致致命的影响(尽管看起来有点傻)。 - Scheff's Cat