【问题标题】:pointers to compare objects for equality c++用于比较对象是否相等的指针c ++
【发布时间】:2015-11-09 22:40:21
【问题描述】:

由于指针是整数,所以如果

Object* one = new SameObject();
Object* two = one;

那么如果我将onetwo 进行比较,我会得到正确的结果。

我可以用它来比较两个这样的对象是否相等吗?这可以作为平等的保证吗?初始化后,对象是否随时在堆中移动?

【问题讨论】:

  • SameObject 是一个变量,它不在堆中分配。堆数据使用newmalloc() 分配。
  • 当程序员看到两个指针被比较时,他们期望两个指针正在被比较。任何其他行为只会让你看起来很奇怪。
  • 我用它来实现对象的连接图。我现在意识到这不是这样做的方法。
  • 指针不是整数。如果指针是整数,我们应该能够对指针进行除法。我们不可以。示例:int X = 4, * Xp = &X, * Yp = Xp / 10;
  • 不是整数数据类型意义上的整数,而是一个内存地址,它是一个数字,一个无符号整数。你可以用数字加/减指针——这叫做指针算术。

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


【解决方案1】:

我可以用它来比较两个这样的对象是否相等?

不推荐。因为平等通常不被解释为“它是同一个对象”。两个都包含值 4 的不同整数(占用不同的内存地址)被认为是相等的。

这可以作为平等的保证吗?

不,如上所述

初始化后,对象是否在堆中移动?

不清楚你在这里的意思。但我认为你的意思是一个对象,一旦在堆上创建,它就不会移动。答案是,是的。例如,如果您继续通过 push_back() 将对象插入 std::vector。由于向量的项目必须是连续的,如果空间不足,它将分配一个新的更大的空间并将所有旧值复制到新空间中。所以,是的,所有这些堆分配的对象现在都将位于一个新位置。

【讨论】:

  • 是的,这正是我的意思。谢谢!
  • 这并不过分正确。对象一旦创建,技术上就不会移动。但是,它们可以被复制到新位置(可能调用移动构造函数!),并且前一个对象被销毁。虽然差异很细微,但确实存在。
  • 要么,要么,指针对于对象比较非常不可靠是结论,对吗?
【解决方案2】:

如果您要比较全局变量或静态变量,则没有两个变量可以具有相同的地址,并且它们永远不会被移动。因此,如果地址相等,则指针必须引用相同的变量,并且值将相等。

对于局部变量,只要您没有从声明变量的函数返回,这将是正确的。局部变量的地址仅在该函数调用正在进行时才有效。从一个函数返回,然后调用其他函数后,第一个函数中的变量地址很可能与第二个函数中的变量比较相等。任何使用具有返回值的函数中的变量地址都会导致未定义的行为。

同样,堆分配对象的地址(使用newmalloc() 创建)只有在对象被删除(使用deletefree())之前才有效。堆对象不被移动(或者如果它们被移动,它应该对程序是透明的)。但是如果你删除一个对象,然后再创建一个新对象,新对象就可以得到被删除对象的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 2020-11-19
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多