【问题标题】:C++ static vs global with pointers?C ++静态与带指针的全局?
【发布时间】:2021-09-06 22:31:58
【问题描述】:

在 C++11 中,我写了(全局):

static MallocMetadata *dummy_block = &MallocMetadata{};

我收到了一条警告,说我正在处理临时地址。

  1. 为什么这是一个警告?在我的 main.cpp 文件结束之前不是静态的吗?

  2. 当我把它改成:

    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 中,允许编译器忽略临时)。

标签: c++ class static global


【解决方案1】:

编译器不会抱怨dummy_block 是临时的,但MallocMetadata{} 是临时的。在这一行:

static MallocMetadata *dummy_block = &MallocMetadata{};

该临时文件的生命周期持续到;。您可以存储一个指向它的指针,但在初始化之后指针立即变得无用。

PS:您的 2. 似乎还可以,但不清楚为什么您在需要将对象存储在某个地方时坚持使用指针:

static MallocMetadata dummy_block;

在您使用dummy_block 的任何地方,请改用&dummy_block

【讨论】:

  • 我虽然编译器足够聪明,但我知道,既然我指向某个东西,那么我需要那个东西......
  • @ariel 编译器足够聪明,知道什么?编译器一点也不聪明,它只是遵循规则,临时的就是临时的
  • @ariel 是的,如果你真的想要使用指针,你可以使用newstatic auto ptr = new MallocMetadata;
  • @ariel - 编译器足够聪明,可以对您的代码进行诊断,因为标准(这是评估所有编译器正确性的标准)指定您正在尝试的事情是一个可诊断的错误。该标准不要求获取对象的地址并将地址存储在指针中以延长对象的寿命。
猜你喜欢
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2014-04-19
  • 2011-10-25
  • 1970-01-01
  • 2015-06-12
  • 2011-01-17
  • 2017-03-11
相关资源
最近更新 更多