【发布时间】:2011-01-03 16:49:18
【问题描述】:
我了解放置新调用通常与对析构函数的显式调用相匹配。我的问题是:如果我不需要析构函数(没有代码放在那里,也没有具有析构函数的成员变量)我可以安全地跳过显式析构函数调用吗?
这是我的用例:我想为 C API 编写 C++ 绑定。在 C API 中,许多对象只能通过指针访问。而不是创建一个包含单个指针的包装对象(这很浪费并且在语义上令人困惑)。我想 使用placement new 在C 对象的地址处构造一个对象。 C++ 对象在其构造函数或析构函数中什么都不做,它的方法除了委托给 C 方法之外什么也不做。 C++ 对象将不包含虚方法。
我对这个问题有两个部分。
这个想法在任何生产编译器的实践中都行不通吗?
这在技术上是否违反 C++ 语言规范?
【问题讨论】:
-
新位置是您应该这样做的罕见时间之一。
-
@Josh:我不认为我理解这个问题。为什么不将 C 对象作为 C++ 对象的唯一数据成员?然后在您的成员函数中,将指向该成员的指针传递给您委托的 C API 函数。
-
@Josh: 或者,您可以使用
shared_ptr(或者更确切地说,一个包装器)作为“句柄”,如果需要根据 C API 正确清理,可以使用自定义删除器.这在逻辑上是一个指针并且表现得像一个值,但具有熟悉的好处。但是,从您为那些共享所有权语义付费的意义上说,这是“浪费”的,但与世界上所有其他shared_ptr的使用一样...... -
@John Haberman:绝对不是。放置 new 将破坏您的旧对象。
-
@Charles:也许最好说“放置新的位置会抹掉你的旧对象”。当您说“销毁”时,它似乎暗示它将调用原始对象的析构函数,但它不会这样做。
标签: c++