用于比较对象c ++的指针

时间:2015-11-09 22:40:22

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

由于指针是整数,因此想法是

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

然后,如果我将onetwo进行比较,我将会成真。

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

2 个答案:

答案 0 :(得分:4)

  

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

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

  

这可以用来保证平等吗?

不,如上所述

  

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

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

答案 1 :(得分:1)

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

对于局部变量,只有在没有从声明变量的函数返回时才会出现这种情况。局部变量的地址仅在该函数调用正在进行时有效。从一个函数返回,然后调用其他函数后,第一个函数中变量的地址可能比较等于第二个函数中的变量。任何使用返回函数的变量地址都会导致未定义的行为。

类似地,堆分配对象(使用newmalloc()创建)的地址仅在删除对象之前有效(使用deletefree() )。不移动堆对象(如果它们是,它应该对程序透明)。但是,如果删除一个对象,然后创建一个新对象,新对象可以获取已删除对象的地址。