次のコードは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
。はい。