为什么两个不同对象的地址应该不同?
我一直在阅读关于这个东西,对象的大小应该至少有1个字节(C++: What is the size of an object of an empty class?),并有两个空对象相同的地址有什么错?毕竟,我们可以有两个指向同一个对象的指针。为什么两个不同对象的地址应该不同?
谷歌搜索告诉我有关于对象身份fundemantal规则的东西,但我找不到更详细的信息。
所以... $ SUBJ。
在相同地址处有两个对象意味着当用指针引用它们时,将无法区分这两个对象。例如,在下面的代码:
EmptyClass o1;
EmptyClass o2;
EmptyClass * po = &o;
po->foo();
应该foo的方法上o1
或o2
称为?
有人可能会认为,由于这些对象没有数据并且没有虚拟方法(否则它们将具有非零大小),因此调用该方法的实例并不重要。
template < typename T >
bool isSame(T const & t1, T const & t2)
{
return &t1 == &t2;
}
EmptyClass o1; // one object and...
EmptyClass o2; // ...a distinct object...
assert(! isSame(o1, o2)); // ...should not be one and same object!
对于更具体的例子,让我们假设,我想某些对象联系起来(我可以:然而,当我们要测试的两个对象是相等的(即,如果它们是相同的),这将成为更重要说实体)与一些价值观,让我们在关联容器说:
Person you;
Person me;
// You and I are two different persons
// (unless I have some dissociative identity disorder!)
// Person is a class with entity semantics (there is only one 'me', I can't make
// a copy of myself like I would do with integers or strings)
std::map< Person *, std::string > personToName;
personToName[&you] = "Andrew_Lvov";
personToName[&me] = "Luc Touraille";
// Oh, bother! The program confused us to be the same person, so now you and I
// have the same name!
所以,是的,这一切都归结为对象标识:如果对象被允许是空的,他们可能被剥夺自己的身份,这是根本不允许的语言(谢天谢地)。
每个对象都必须占用不同的存储空间,否则无法取消分配一个对象而不释放与其共享存储的其他对象。
假设你有一个地址,两个不同的对象:
Type* object1 = new Type(); //first object
Type* object2 = new Type(); //second object
,他们碰巧是在同一地址,那么你
delete object1;
会是怎样delete
d,如果他们都具有相同的地址?
当你有两个指向同一个对象的指针时,你可以使用其中的任何一个来操纵对象。结果=您可以访问该对象。
但是,如果你在同一地址有两个对象,你将如何区分它们在内存中?如果你有一个指向那个地址的指针,你怎么知道你的指针指向哪个对象?
因此,即使是空的,每个对象都需要不同的地址。
C++有(除其他外)一条规则,指向对象的指针比较等于当且仅当指针指向同一对象时。在你提出的情景下,这将不再是事实。
还有一些代码只是假设sizeof
也会产生严格的正面结果。突出部分,例如,相当多的代码使用喜欢的东西:
#define elements(array) ((sizeof(array)/sizeof(array[0]))
对于对象的大小为零,这将导致0/0
,这在数学上是不确定的。
而不是在其他地方进行更改以支持一个角落案例,简单地消除角落案例以适应现有规则要简单得多。
尝试一个比喻。
如果您有两辆车,并且您尝试让它们占据相同的物理空间,您将会发生碰撞。
如果你有两个对象,并且你试图让它们占据相同的内存空间,那么你也会崩溃。
每当我看到像这样的问题时,我认为世界已经变得更好一个*创建。 – sharptooth 2011-02-11 15:38:44