【问题标题】:Does the addresses of the pointers change under certain cases [closed]在某些情况下指针的地址是否会改变[关闭]
【发布时间】:2018-05-01 23:52:51
【问题描述】:

如果我创建某个已定义类的类型指针向量并将指针指向其中的第一个继承对象类型的对象,指向下一个地址的指针不会更改为指向移位地址因为在前一个指向的继承类中存在新的数据成员。

so 如果我定义了一个基类的new类型的数组,然后放入一个驱动类类型的对象,编译器将如何处理修改next指针的起始地址。不应该移动它或类似的东西以使一些字节可用于前一个字节。

【问题讨论】:

  • 指针大小相同,无论是指向基类还是派生类。当然,正如您所提到的,如果派生类有新成员,对象的大小可能会有所不同。
  • 我很难理解你的问题,但我认为答案是“否”——指针可以指向任意大小的块——这就是重点(对不起;-)
  • 你的向量是否包含对象或指针?
  • 如果你有一个vector<Base> 并强制它存储一个Derivedyou will get object slicing。如果你有一个vector<Base *> 并存储一个Derived *,那么只要虚函数在运行并且对象是正确的多态,你应该没有问题。指针大小相同。请注意,您可能需要留意 Cylons 与 Base * 闲逛的情况。
  • 如果您不理解指针,请不要使用它们...

标签: c++ pointers dynamic-memory-allocation


【解决方案1】:

如果您定义一个std::vector<BaseClass>,其中BaseClass 是您的基类,然后将一个DerivedClass 类型放入该向量中,其中DerivedClass 是您的派生类,您将获得切片。这意味着派生类中的任何额外数据成员都将丢失。

因此,您通常会定义一个std::vector<BaseClass *>,它是基类指针的向量。现在您可以将基类指针和派生类指针放在向量中,并且没有切片。

您将指针存储在向量中。所有指针的大小都相同。

请注意,在现实世界中,您可能不会使用原始指针,而是使用某些版本的智能指针来减少内存泄漏的机会(即忘记释放指针)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2022-01-21
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多