有人告诉我,以下代码在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语言中没有未定义的行为。但是,如果我int
在C代码中分配一个并在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
?是。