簡體   English   中英

在 C++20 之前使用 malloc 進行 int 未定義行為

[英]Is using malloc for int undefined behavior until C++20

有人告訴我,在 C++20 之前,以下代碼的行為未定義:

int *p = (int*)malloc(sizeof(int));
*p = 10;

真的嗎?

爭論是int object 的生命周期在分配值之前沒有開始( P0593R6 )。 要解決此問題,應使用放置new

int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;

我們真的必須調用一個默認構造函數來啟動 object 的生命周期嗎?

同時,代碼在純 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 *p = (int*)malloc(sizeof(int));

實際上創建了一個int類型的 object ,因此取消引用p是 UB,因為那里沒有實際的int

我們真的必須調用默認構造函數來啟動 object 的生命周期嗎?

您是否必須按照 C++ object model 來避免 C++20 之前的未定義行為? 是的。 如果您不這樣做,任何編譯器實際上會造成傷害嗎? 不是我知道的。

[...] 它仍然是未定義的行為嗎?

是的。 在 C++20 之前,您實際上還沒有在任何地方創建int object 所以這是 UB。

是的,是UB。 枚舉了int可以存在的方式列表,但沒有一個適用於此,除非您認為 malloc 是非因果的。

它被廣泛認為是標准中的一個缺陷,但重要性不高,因為 C++ 編譯器圍繞 UB 的特定位所做的優化不會導致該用例出現問題。

至於第二個問題,C++ 沒有規定 C++ 和 C 如何交互。 因此,與 C 的所有交互都是... UB,也就是 C++ 標准未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM