由于指针是整数,因此想法是
Object* one = new SameObject();
Object* two = one;
然后,如果我将one
与two
进行比较,我将会成真。
我可以用它来比较两个这样的对象是否相等?这可以用来保证平等吗?初始化后,对象是否在堆中移动?
答案 0 :(得分:4)
我可以用它来比较两个这样的对象是否相等?
不推荐。因为平等通常不被解释为“它是同一个对象”。两个包含值4的不同整数(占用不同的内存地址)被认为是相等的。
这可以用来保证平等吗?
不,如上所述
初始化后,对象是否在堆中移动?
目前尚不清楚你的意思。但我认为你的意思是一个对象,一旦在堆上创建,它是否会移动。答案是肯定的。例如,如果您通过push_back()继续将对象插入到std :: vector中。由于向量的项必须是连续的,如果它用完了空间,它将分配一个新的更大的空间并将所有旧值复制到新空间中。所以,是的,所有这些堆分配的对象现在都将位于新的位置。
答案 1 :(得分:1)
如果您要比较全局或静态变量,则两个变量不能具有相同的地址,并且它们永远不会被移动。因此,如果地址相等,则指针必须引用相同的变量,并且值将相等。
对于局部变量,只有在没有从声明变量的函数返回时才会出现这种情况。局部变量的地址仅在该函数调用正在进行时有效。从一个函数返回,然后调用其他函数后,第一个函数中变量的地址可能比较等于第二个函数中的变量。任何使用返回函数的变量地址都会导致未定义的行为。
类似地,堆分配对象(使用new
或malloc()
创建)的地址仅在删除对象之前有效(使用delete
或free()
)。不移动堆对象(如果它们是,它应该对程序透明)。但是,如果删除一个对象,然后创建一个新对象,新对象可以获取已删除对象的地址。