为什么两个不同对象的地址应该不同?

And*_*vov 7 c++ oop

我一直在读这个东西,一个对象的大小至少应该是1个字节(C++:空类的一个对象的大小是多少?)和两个空对象在同一个地址有什么不对?毕竟,我们可以有两个指向同一个对象的指针.

谷歌搜索告诉我有一些关于对象身份fundemantal规则,但我找不到更详细的信息.

所以... $ SUBJ.

Luc*_*lle 6

在同一地址处有两个对象意味着在使用指针引用它们时无法区分这两个对象.例如,在以下代码中:

EmptyClass o1;
EmptyClass o2;

EmptyClass * po = &o;
po->foo();
Run Code Online (Sandbox Code Playgroud)

应该调用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!
Run Code Online (Sandbox Code Playgroud)

对于一个更具体的例子,让我们假设我想将一些对象(我可以说实体)与一些值相关联,比如说在一个关联容器中:

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!
Run Code Online (Sandbox Code Playgroud)

所以是的,这一切都归结为对象身份:如果允许对象为空,则可能会剥夺他们的身份,而这种语言根本不允许(谢天谢地).


sha*_*oth 5

每个对象必须占用不同的存储空间,否则在不释放与其共享存储空间的其他对象的情况下,您无法取消分配一个对象.

假设您在一个地址有两个不同的对象:

Type* object1 = new Type(); //first object
Type* object2 = new Type(); //second object
Run Code Online (Sandbox Code Playgroud)

他们碰巧在同一个地址,然后你

delete object1;
Run Code Online (Sandbox Code Playgroud)

delete如果他们都有相同的地址会是什么?

  • 这种逻辑并不是很稳固.如果我们在相同的地址允许零大小的对象,那么为no-ops这样的对象声明`new`和`delete`是合乎逻辑的,即`new`会返回一些任意地址(它没关系,因为它无论如何都不是无法解决的)并且`delete`根本就什么都不做. (3认同)