|
|
1
25
这真的非常简单:
不能保证
因此,以下内容被认为是等效的:
同样适用于
当你看到这一切的时候,你可以很容易地推理
使用放置时
因此,您必须分别跟踪两件事:
下面的代码演示了它们是如何相互独立的:
如果对象的生存期超过了内存的生存期,那么程序就有UB。确保内存 总是 比物体的寿命更长。例如,它有UB:
但这没关系:
请注意如何使用
在某些特定类型中,不调用析构函数和不正确对齐内存不会导致UB,但您永远不应该假设类型有这种情况。调用析构函数并进行对齐,如果结果是不必要的,则不会花费任何代价——不会为此类类型生成额外的代码。
|
|
|
2
6
这可能是为了 CodeReview.SE ,在我回答您的问题之前,让我先评论一下您的源代码。
你通常不会调用对象的析构函数 不 使用新放置创建。在您的情况下,您将销毁旧的,并使用放置新的构造新的。尽管这是有效的,您还是应该实现一些 重置 重置对象而不是销毁和构造新对象的功能。
这是UB。你已经破坏了这个对象,你不应该对它调用任何方法。
这是
奥卡伊语
,但请注意
你的评论是错误的。你不是在删除两个对象,而是在稍后再删除一个。
这也是-UB,不要对解构或删除的对象调用方法。 对于您的问题:
不要给他们打电话
不,不是。有很少的例子说明为什么需要调用析构函数,其中一个例子是对象是通过放置new创建的。在您的示例中,这没有副作用,因为在解构旧对象之后,您在同一位置构造了一个新对象,并且新对象与旧对象的类型相同,否则这可能会以某种方式严重损坏。
现在,在删除后,再详细了解一下您的评论。让我们看看
新产品:
删除的效果相反:
现在到placement new:placement新只跳过第一步(分配内存)并调用其构造函数
新
对象
这意味着在调用析构函数之后,对于您的代码,您的第一个对象 死亡 但是你从来没有把内存还给我,这就是为什么你可以在内存中构造一个新的对象。现在,当您调用delete时,第一个对象不再存在,只有它使用的内存,但相同的内存现在被第二个对象阻塞,因此当您调用delete时不会删除两个对象,只删除第二个(您解构它,然后释放内存块)。 您可以阅读有关主题放置的更多信息,以及何时调用析构函数 isocpp's faq |
|
|
3
-1
这两个答案都很好。但你也不知道它是如何工作的,因此,我将在大会上补充说明:
这就是它的工作原理,足够清晰,不需要更多解释,对吧? |
|
|
vikrant · C++放置新的工作原理是什么? 10 年前 |