@@ -7,7 +7,8 @@ namespace PLATEAU.Native
77{
88 /// <summary>
99 /// GridCodeのC++ Vectorです。
10- /// 中身はVectorの廃棄時の削除するので、それまでは中身が削除されないよう注意してください。
10+ /// 中身はVectorの廃棄時に削除されます。
11+ /// ダングリングを防ぐため、vectorへの追加・参照時はコピーを渡します。
1112 /// </summary>
1213 public class NativeVectorGridCode : NativeVectorDisposableBase < GridCode >
1314 {
@@ -21,6 +22,9 @@ public static NativeVectorGridCode Create()
2122 return new NativeVectorGridCode ( ptr ) ;
2223 }
2324
25+ /// <summary>
26+ /// インデックスでアクセスし、そのコピーを返します。
27+ /// </summary>
2428 public override GridCode At ( int index )
2529 {
2630 ThrowIfDisposed ( ) ;
@@ -40,11 +44,18 @@ public override int Length
4044 }
4145 }
4246
43- public void Add ( GridCode gridCode )
47+ /// <summary>
48+ /// 追加します。ただし、無効なGridCodeの場合は何もしません。
49+ /// </summary>
50+ public void AddCopyOf ( GridCode gridCode )
4451 {
45- gridCode . PreventAutoDispose ( ) ;
52+ if ( ! gridCode . IsValid ) return ;
53+ // ダングリングを防ぐためコピーを追加します。
54+ var copied = GridCode . CopyFrom ( gridCode . Handle ) ;
55+ // vectorが廃棄されるまでGridCodeが廃棄されないようにします。
56+ copied . PreventAutoDispose ( ) ;
4657 var result = NativeMethods . plateau_vector_grid_code_push_back_value (
47- Handle , gridCode . Handle ) ;
58+ Handle , copied . Handle ) ;
4859 DLLUtil . CheckDllError ( result ) ;
4960 }
5061
0 commit comments