これらは, 「可変長の配列」として働くユーティリティ・クラス.
((cite: hotspot/src/share/vm/utilities/growableArray.hpp))
// A growable array.
可変長の配列として働くユーティリティ・クラス (の基底クラス).
((cite: hotspot/src/share/vm/utilities/growableArray.hpp))
class GenericGrowableArray : public ResourceObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
See: here for details
GenericGrowableArray クラスの具象サブクラス.
なお要素の型は template でパラメタライズされている.
((cite: hotspot/src/share/vm/utilities/growableArray.hpp))
template<class E> class GrowableArray : public GenericGrowableArray {
HotSpot 内の様々な箇所で使用されている (#TODO).
GrowableArray の中に Handle を入れる場合は Handle の有効範囲に注意するように, とのこと.
(Handle が GrowableArray の中に入ったまま HandleMark のスコープ外に出てしまうとダングリングポインタになる).
((cite: hotspot/src/share/vm/utilities/growableArray.hpp))
/*************************************************************************/
/* */
/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */
/* */
/* Should you use GrowableArrays to contain handles you must be certain */
/* the the GrowableArray does not outlive the HandleMark that contains */
/* the handles. Since GrowableArrays are typically resource allocated */
/* the following is an example of INCORRECT CODE, */
/* */
/* ResourceMark rm; */
/* GrowableArray<Handle>* arr = new GrowableArray<Handle>(size); */
/* if (blah) { */
/* while (...) { */
/* HandleMark hm; */
/* ... */
/* Handle h(THREAD, some_oop); */
/* arr->append(h); */
/* } */
/* } */
/* if (arr->length() != 0 ) { */
/* oop bad_oop = arr->at(0)(); // Handle is BAD HERE. */
/* ... */
/* } */
/* */
/* If the GrowableArrays you are creating is C_Heap allocated then it */
/* hould not old handles since the handles could trivially try and */
/* outlive their HandleMark. In some situations you might need to do */
/* this and it would be legal but be very careful and see if you can do */
/* the code in some other manner. */
/* */
/*************************************************************************/
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.