就在我以为自己能很好地掌握指针的时候,我又一次感到困惑。您的见解可能会有所帮助。

我想我可以用非常笼统的方式陈述让我感到困惑的地方,例如:

a)如果我写A* p = new A(); (其中A是某个类),然后执行(*p).do_stuff()之类的操作,然后p指向的对象可能会在内存中移动,那么为什么p仍指向我的对象?

b)类和类的成员变量如何存储在内存中。

但是,也许我更具体地告诉您这个问题会更有用。说我有一个具有成员变量Car的类Engine engine_;(其中Engine是其他某个类)。精细。现在假设由于某种原因,我想创建一个类,该类的成员变量是指向Engine的指针,例如:

class Car
{
    friend Repair;
public:
    Car() {engine_ = Engine();}
private:
    Engine engine_;
};

class Repair
{
public:
    Repair(const Car &car) : engine_(&(car.engine_)) {}
private:
    Engine *engine_;
};


repair.engine_不可能总是指向我汽车的引擎,是否存在(?)但即使在第二个版本中:

class Car
{
    friend Repair;
public:
    Car() {engine_ = new Engine();}
    ~Car() {delete engine_;}
private:
    Engine *engine_;
};
// Maybe I need/should write consts somewhere, not sure

class Repair
{
public:
    Repair(const Car &car) : engine_(car.engine_) {}
private:
    Engine *engine_;
};


尽管似乎有更多的机会可以奏效,但我不知道如何/不知道是否会...

预先感谢您的回答!

最佳答案

如果我写A* p = new A();(其中A是某些类),然后做类似(*p).do_stuff()的操作,则p指向的对象可能会在内存中移动


不,不会。 (至少,*p会保留原样;如果它本身具有指针成员,则这些成员可能会重置为指向其他位置。)


  类和类的成员变量如何存储在内存中


作为位。

class Foo {
    int i;
    char *p;

  public:
     void bla();
};


将被表示为int的位(可能是32),然后是指针的位(32或64),中间可能有一些填充。该方法不会占用您实例的空间,它是单独存储的。

至于您的示例,我并不完全理解问题。只要Car对象存在,只要Engine*保持活动并且不重置其Repair,它就应该起作用。 (不过,它看起来并不特别健壮。)

10-07 16:27
查看更多