1

我听说过 C++ 的placement new 运算符。我很困惑它是什么。但是,我可以看到它可以在stackoverflow中的问题下使用。我也很困惑我们是否在java中有这个。所以我的问题非常准确:什么是placement new 运算符,我们在java 中有类似的东西吗?

请注意,不要与 stackoverflow 上的其他问题混淆:它们不是这个问题的重复。

4

3 回答 3

3

以下文章解释了 C++ 中放置 new 的含义:http ://www.glenmccl.com/nd_cmp.htm

该术语本身与重载new语句相关。由于 Java 根本不允许重载运算符,特别是 new 运算符,因此放置 new 与 Java 无关。

但是你有几种选择。

  1. 使用工厂模式或建造者模式
  2. 使用包装器/装饰器模式(可能与工厂一起),允许通过包装其方法来更改某些类功能。
  3. 面向方面的编程。它的工作方式几乎与装饰器模式类似,但可以使用字节码修改来实现。
  4. 类加载器拦截
于 2011-09-14T06:16:37.893 回答
2

“新安置”一词本身有些含糊。该术语在 C++ 标准中以两种不同的方式使用,因此被 C++ 社区使用。

第一个含义是指任何operator new具有多个参数的重载函数。附加参数几乎可以用于任何事情——标准本身有两个示例:operator new(size_t, void*)operator new(size_t, std::nothrow_t const&).

第二个含义是指具体的重载operator new(size_t, void*),实际上是用来显式调用从别处获得的内存上的对象的构造函数:将分配与初始化分开。std::vector(例如,它将用于capacity()可能大于的类中size()。)

在 Java 中,内存管理被集成到语言中,而不是库的一部分,因此没有等价物。

于 2011-09-14T08:16:12.450 回答
-1

Placement new 允许指定采用额外参数的自定义分配器。

还有一个预定义的放置分配器,它将一个指针作为额外参数,并作为分配该指针的结果返回,基本上允许您的代码在您指定的地址创建对象。

但是,您可以定义采用其他参数的其他类型的分配器,例如我们的调试分配器将文件名和执行分配的行作为额外参数。将这些额外信息与分配的对象一起存储允许我们回溯到源代码,在该源代码中创建了某个对象实例,例如在释放后被泄露、覆盖或使用。

AFAIK Java 在更高的概念级别上工作,并且没有指针概念(只有空指针异常;-))。内存只是一个黑魔法盒,程序员从不使用内存地址的想法。

我只知道 Java 1.1,然后决定不花时间在那个商业产品上,所以今天 Java 的逻辑级别可能已经降低到足以达到随机存取内存的概念。

于 2011-09-14T06:12:55.653 回答