【发布时间】:2021-09-06 22:31:58
【问题描述】:
在 C++11 中,我写了(全局):
static MallocMetadata *dummy_block = &MallocMetadata{};
我收到了一条警告,说我正在处理临时地址。
-
为什么这是一个警告?在我的 main.cpp 文件结束之前不是静态的吗?
-
当我把它改成:
static MallocMetadata dummy_block = MallocMetadata{}, *last_free_block = &dummy_block;
我没有收到关于 last_free_block 的警告,为什么会这样?
【问题讨论】:
-
为什么不只是
static MallocMetadata dummy_block = MallocMetadata{};?为什么一定要有指针? -
在这两种情况下,
MallocMetadata{}都会构造一个在dummy_block初始化后立即停止存在的临时对象。在第一种情况下(如果假设允许)dummy_block将是一个悬空指针(指向不再存在的对象的指针) - 但不允许获取地址的规则不允许这样做(即你的re doing 是一个可诊断的错误,而不仅仅是一个警告)。在第二种情况下,dummy_block被初始化为临时的副本(尽管在 C++11 中,允许编译器忽略临时)。