【问题标题】:Can address value of a static variable match with a heap allocated address?静态变量的地址值可以与堆分配的地址匹配吗?
【发布时间】:2018-02-24 18:02:39
【问题描述】:

我的一些sn-ps代码如下

static const int s_kVar1 = 0;
static const int s_kVar2 = 1;

...

void foo()
{
    MyObject *o = new MyObject();
    // Is it ever possible that (o == &s_kVar1) or (o == &s_kVar2)
}

【问题讨论】:

  • 你的问题好像是问o == &s_kVar1,但是代码问的是&o == &s_kVar1
  • 顺便说一句,我认为您不明白 static 在这种情况下的含义。如果这些变量的常量很重要。
  • o&s_kVar1 是指向不同类型的指针,因此无法比较。如果您说o == (MyObject*)&s_kVar1,则在具有不同大小指针的系统上可以比较相等,具体取决于类型。
  • @RaymondChen 我认为这是不必要的言语,OP想知道地址可以相等,这不是有效语法的问题。它们都可以转换为void *。而且我不认为将int * 转换为MyObject * 是合法的
  • @tobi303 是迂腐的,不是代码,而是评论以显示想法

标签: c++ pointers memory static heap-memory


【解决方案1】:

没有。静态变量存储在 .BSS 或 .DATA 段中,具体取决于它们是否已初始化或未初始化(0 已初始化)。在你的情况下,

静态常量 int s_kVar1 = 0;将进入 .BSS 和
静态常量 int s_kVar2 = 1;将进入.DATA

堆用于动态分配。

顺便说一句,我不明白您为什么在文件范围内使用 static const 。 const 默认情况下进行内部链接,全局变量具有静态生命周期。当然,除非您使用 C,我可以看到它很有用。

【讨论】:

    【解决方案2】:

    简短的回答是否定的。保证不同的对象有不同的地址。全局 (s_kVar) 和动态分配的对象 (o) 位于不同的内存区域。

    附:但是,是的,您可以滥用该语言来破坏该保证。你可以在同一个内存位置构造两个不同的对象。

    【讨论】:

    • @MadPhysicist 一次只能有一个工会成员处于活动状态。
    • @昆汀。出于同样的原因,只有一个对象可以在给定时间真正破坏给定的内存位置。这不会影响我的投票。
    猜你喜欢
    • 2012-11-13
    • 2015-09-30
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2019-09-08
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多