是否安全的记录这在构造函数中的值

问题描述:

我正在追踪构造函数及其析构的实例,为此我计划在构造函数和析构函数中记录“this”的值。我不知道在构造函数中记录“this”的值是否安全。如果它不安全,那么我不想知道它会失败的场景?是否安全的记录这在构造函数中的值

如果通过“日志记录”的意思是“将值写为例如十六进制地址到日志文件”,那么它很好,很安全。如果没有,请澄清。

在构造函数调用完成之前对象没有完全构造。因此在此之前(即从构造函数中)将this发布到程序的其余部分是不安全的。因为这可能导致有人试图实际使用半结构对象。这可能会导致微妙而难以发现的错误。

发布this可以意味着下列情况之一:

  • 传递作为参数的外部(非成员)函数,
  • 其存储在提供给其他对象的数据结构,
  • (为了完整起见:从函数调用返回它 - 这不适用于此特定情况,因为您不能从构造函数返回任何东西)。

写出的this到一个文件中的地址,因此不会发布到你的程序*的其余部分,因此应该罚款。

* ,除非你做一些很神秘的东西之后,好像在不同的线程/进程加载回从该文件的地址和铸造回一个对象指针......这已经足够不安全本身: - )

+0

是的我只是想将这个值保存在日志文件中,并且每当调用该实例的析构函数时,我都会记录该值。我正在这样做,以确定析构函数没有被调用的那些实例(this)。在保存构造函数中的值的同时,我正在做的另一件事是,我将调用堆栈保存在日志文件中。在调用堆栈的帮助下,我可以很容易地知道哪个调用堆栈实例没有被破坏。 – 2012-04-21 08:13:14

+0

我也向同事问过同样的问题,他们说它在构造函数中记录这个值并不安全,因为那时对象没有完全构造。请清除我的疑问,并让我知道它会失败的场景 – 2012-04-21 08:14:40

+0

否否我不会在程序中再次加载此值。我已经向你解释了我正在使用的这个场景。我只想跟踪未被破坏的实例。 – 2012-04-21 08:18:34

为什么你认为这不安全?事实上,只要这些对象是有效的,就记录任何对象的地址也不例外。

它的长短之处在于它在您打算使用它的场景中是安全的。

+0

由于该对象没有完全构建。所以,我认为它不安全,它可能会扔垃圾? – 2012-04-21 08:15:43

+0

如果您到达构造函数阶段,构造对象,它的成员可能不会取决于您如何初始化您的成员,即初始化列表与一些initialise()函数,因此您的成员可能有垃圾值,但类对象将是有效的 – EdChum 2012-04-21 08:17:58

+0

所以,我用来记录这个跟踪构造函数和析构函数的情况,是安全的,我也在构造函数中记录调用堆栈。我认为这是跟踪程序中非破坏序列的好方法,也很容易发现内存泄漏。 – 2012-04-21 08:23:16

先分配内存,然后设置this,然后调用构造函数。所以你可以在构造函数中使用this,因为它指向正确的位置 - 构造不会改变this。然而,如果构造失败(抛出),内存将消失,并且this指向的值将是垃圾,因此您不应将其存储并用于构造函数外的任何内容,直到您知道构造将成功为止。