【问题标题】:call constructor multiple times多次调用构造函数
【发布时间】:2013-06-27 19:07:30
【问题描述】:

调试一个疯狂的系统。 一个类的构造函数被多次调用,它们的内存地址是一样的。这是否意味着它们是同一个对象? 创建对象@0xa3d82a0 创建对象@0xa3d82a0 创建对象@0xa3d82a0

我还看到 xxxx 是一个守护进程。 守护进程是什么意思?

谢谢!

【问题讨论】:

  • 这可能是构造函数在内存中的地址(虽然不确定)

标签: c++ constructor daemon


【解决方案1】:

这可能只是意味着构造函数被保存在同一块内存中(引用位置等)以节省内存。

至于问题的第二部分,引用:“守护程序(或服务)是一个后台进程,旨在自主运行,几乎不需要用户干预。”

Taken from here(不要理会页面上的任何链接,它们似乎都已经死了。不过只是搞砸了锚标签)。

【讨论】:

  • 但这是否意味着类中变量的值对于所有对象都是相同的?
  • 嗯,这取决于构造函数。如果它只是一个没有任何参数的默认构造函数,那么根据定义是。但是如果它接受参数,那么它很可能在调用时已经传递了参数的值/内存位置,并在每个操作中使用了这些值。该调用所做的是引用正在声明对象的指令集(在汇编或类似中)的内存位置。它可能在每次被调用时都会执行它的工作,然后将新对象保存在空闲内存中并返回堆栈。
  • 抱歉,还是有点混乱。构造函数中没有参数。但是如果一个对象给类中的一些指针一些值,而其他对象引用这些指针,它们会得到与第一个对象相同的值吗?
  • 没有。我想说的是,用于创建对象的指令集可能位于内存的静态点 (0xa3d82a0) 中,但这并不意味着所有对象都是相同的。它们是(应该是)位于不同内存位置的独立实例。所以以后对对象的访问应该引用单独的对象。
  • 我明白了.. 谢谢!这就是我想要避免的。有没有办法让他们使用一些变量?例如,我想定义一些指针并为它们复制一些内容。有没有一种简单的方法只做一次,而不是每个对象?
【解决方案2】:

不,它不是同一个对象。一个对象只能构造一次。您看到的行为并非不可能,例如,如果在循环中在堆栈上分配了许多对象:

#include <iostream>

using namespace std;

struct A {
    A() { cout << "Creat" << this << endl; }
};

int main() {
    for (int i = 0; i < 5; i++) {
        A a;
    }
}

这里 'a' 将在同一位置重复构建,打印如下内容:

Creat0xbfcd871f
Creat0xbfcd871f
Creat0xbfcd871f
Creat0xbfcd871f
Creat0xbfcd871f

【讨论】:

  • 啊……我明白了……我以前从来不知道这个。谢谢。
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多